Python实现端口复用实例代码

作者:shichen2014 时间:2023-12-16 19:58:32 

本文介绍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()
标签:Python
0
投稿

猜你喜欢

  • MySQL常见错误提示及解决方法

    2008-02-23 10:08:00
  • python一键去抖音视频水印工具

    2023-09-26 22:58:21
  • 字符,字节和编码

    2009-12-09 15:59:00
  • 谈谈如何管理门户级网站的CSS/IMG/JS文件

    2009-09-03 11:48:00
  • 再谈float菜单局中

    2009-12-21 19:57:00
  • PHP PDOStatement::rowCount讲解

    2023-06-06 12:24:04
  • asp如何在刷新链接之前验证文件是否存在?

    2010-06-22 21:09:00
  • PHP 截取字符串 分别适合GB2312和UTF8编码情况

    2023-09-30 18:02:30
  • Go事务中止时是否真的结束事务解析

    2023-07-07 11:35:35
  • python判断一个数是否能被另一个整数整除的实例

    2021-02-06 13:25:42
  • python GUI库图形界面开发之PyQt5拖放控件实例详解

    2023-04-26 08:43:24
  • IA学习笔记02:组织体系

    2009-06-12 12:22:00
  • Python大数据之从网页上爬取数据的方法详解

    2023-10-06 22:10:53
  • MySQL Enterprise备份的恢复解决方案

    2011-12-14 18:36:25
  • Python 解决空列表.append() 输出为None的问题

    2023-07-24 14:07:57
  • Go语言文件开关及读写操作示例

    2023-08-05 19:47:27
  • 网页设计中怎么将px换成em

    2008-04-16 13:50:00
  • ajax完美实现两个网页 分页功能的实例代码

    2023-11-14 12:57:27
  • 基于Python制作短信发送程序

    2022-06-19 16:47:25
  • 关于获取HTML元素的CSS属性值函数

    2008-09-01 13:20:00
  • asp之家 网络编程 m.aspxhome.com