Python实现端口复用实例代码
本文介绍Python实现端口复用实例如下所示:
#coding=utf-8
importsocket
importsys
importselect
importthreading
host='192.168.99.100'
port=80
classThread(threading.Thread):
def__init__(self,buf,sockfd):
threading.Thread.__init__(self)
self.buf=buf
self.sockfd=sockfd
defrun(self):
iflen(self.buf)!=0:
if'GET'inself.buf:#判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',80))
s2.send(self.buf)
bufer=''
while1:
recv_data=s2.recv(1024)
bufer+=recv_data
iflen(recv_data)==0:
break
printbufer,len(bufer)
iflen(bufer)==0:
pass
self.sockfd.send(bufer)#将服务器发送的数据发回客户端
s2.close
self.sockfd.close
sys.exit()
else:
'ps:connecttossh'#如果数据不是浏览器提交则将其转发至本地的22端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',22))
s2.send(self.buf)
recv_data=s2.recv(4096)
conn.send(recv_data)
self.sockfd.close
s2.close
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#端口复用的关键点
s.bind((host,port))
s.listen(10)
while1:
infds,outfds,errfds=select.select([s,],[],[],5)#使用select函数进行非阻塞操作
iflen(infds)!=0:
conn,(addr,port)=s.accept()
print'connectedby',addr,port
data=conn.recv(1024)
t=Thread(data,conn)
t.start()
s.close
#coding=utf-8
importsocket
importsys
importselect
importthreading
host='192.168.99.100'
port=80
classThread(threading.Thread):
def__init__(self,buf,sockfd):
threading.Thread.__init__(self)
self.buf=buf
self.sockfd=sockfd
defrun(self):
iflen(self.buf)!=0:
if'GET'inself.buf:#判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',80))
s2.send(self.buf)
bufer=''
while1:
recv_data=s2.recv(1024)
bufer+=recv_data
iflen(recv_data)==0:
break
printbufer,len(bufer)
iflen(bufer)==0:
pass
self.sockfd.send(bufer)#将服务器发送的数据发回客户端
s2.close
self.sockfd.close
sys.exit()
else:
'ps:connecttossh'#如果数据不是浏览器提交则将其转发至本地的22端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',22))
s2.send(self.buf)
recv_data=s2.recv(4096)
conn.send(recv_data)
self.sockfd.close
s2.close
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#端口复用的关键点
s.bind((host,port))
s.listen(10)
while1:
infds,outfds,errfds=select.select([s,],[],[],5)#使用select函数进行非阻塞操作
iflen(infds)!=0:
conn,(addr,port)=s.accept()
print'connectedby',addr,port
data=conn.recv(1024)
t=Thread(data,conn)
t.start()
s.close
例子2
importsocket
tcp1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#在绑定前调用setsockopt让套接字允许地址重用
tcp1.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
tcp2.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
#接下来两个套接字都也可以绑定到同一个端口上
tcp1.bind(('0.0.0.0',12345))
tcp2.bind(('0.0.0.0',12345))
importsocket
tcp1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#在绑定前调用setsockopt让套接字允许地址重用
tcp1.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
tcp2.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
#接下来两个套接字都也可以绑定到同一个端口上
tcp1.bind(('0.0.0.0',12345))
tcp2.bind(('0.0.0.0',12345))
例子3
重定向
importsocket,os
bufLen=4*1024
sock1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock1.bind(('192.168.168.100',8000))
sock1.listen(5)
sock2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock2.connect(('192.168.168.100',12345))
whileTrue:
connection,address=sock1.accept()
buf=connection.recv(bufLen)
#printbuf
sock2.send(buf)
connection.send(sock2.recv(bufLen))
connection.close()
importsocket,os
bufLen=4*1024
sock1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock1.bind(('192.168.168.100',8000))
sock1.listen(5)
sock2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock2.connect(('192.168.168.100',12345))
whileTrue:
connection,address=sock1.accept()
buf=connection.recv(bufLen)
#printbuf
sock2.send(buf)
connection.send(sock2.recv(bufLen))
connection.close()