Python实现端口复用实例代码

1064次阅读  |  发布于5年以前

本文介绍Python实现端口复用实例如下所示:


    #coding=utf-8
    import socket
    import sys
    import select
    import threading
    host='192.168.99.100'
    port=80
    class Thread(threading.Thread):
      def __init__(self,buf,sockfd):
        threading.Thread.__init__(self)
        self.buf=buf
        self.sockfd=sockfd
      def run(self):
       if len(self.buf)!=0:
        if 'GET' in self.buf :  #判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口
         s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
         s2.connect(('127.0.0.1',80))
         s2.send(self.buf)
         bufer=''
         while 1:
          recv_data=s2.recv(1024)
          bufer+=recv_data
          if len(recv_data)==0:
           break
         print bufer,len(bufer)
         if len(bufer)==0:
          pass     
         self.sockfd.send(bufer)  #将服务器发送的数据发回客户端
         s2.close
         self.sockfd.close
         sys.exit()
        else:
         'ps:connect to ssh' #如果数据不是浏览器提交则将其转发至本地的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)
    while 1:
     infds,outfds,errfds=select.select([s,],[],[],5) #使用select函数进行非阻塞操作
     if len(infds)!=0:
      conn,(addr,port)=s.accept()
      print 'connected by',addr,port
      data=conn.recv(1024)
      t=Thread(data,conn)
      t.start()
    s.close
    #coding=utf-8
    import socket
    import sys
    import select
    import threading
    host='192.168.99.100'
    port=80
    class Thread(threading.Thread):
      def __init__(self,buf,sockfd):
        threading.Thread.__init__(self)
        self.buf=buf
        self.sockfd=sockfd
      def run(self):
       if len(self.buf)!=0:
        if 'GET' in self.buf :  #判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口
         s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
         s2.connect(('127.0.0.1',80))
         s2.send(self.buf)
         bufer=''
         while 1:
          recv_data=s2.recv(1024)
          bufer+=recv_data
          if len(recv_data)==0:
           break
         print bufer,len(bufer)
         if len(bufer)==0:
          pass     
         self.sockfd.send(bufer)  #将服务器发送的数据发回客户端
         s2.close
         self.sockfd.close
         sys.exit()
        else:
         'ps:connect to ssh' #如果数据不是浏览器提交则将其转发至本地的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)
    while 1:
     infds,outfds,errfds=select.select([s,],[],[],5) #使用select函数进行非阻塞操作
     if len(infds)!=0:
      conn,(addr,port)=s.accept()
      print 'connected by',addr,port
      data=conn.recv(1024)
      t=Thread(data,conn)
      t.start()
    s.close

例子2


    import socket
    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))
    import socket
    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

重定向


    import socket,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)) 
    while True:
        connection,address = sock1.accept() 
        buf = connection.recv(bufLen) 
        #print buf      
        sock2.send(buf) 
        connection.send(sock2.recv(bufLen))
        connection.close()
    import socket,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)) 
    while True:
        connection,address = sock1.accept() 
        buf = connection.recv(bufLen) 
        #print buf      
        sock2.send(buf) 
        connection.send(sock2.recv(bufLen))
        connection.close()

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8