Python实现端口复用实例代码


Posted in Python onJuly 03, 2014

本文介绍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 相关文章推荐
深入理解Javascript中的this关键字
Mar 27 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
详解Python中的日志模块logging
Jun 19 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
python技能之数据导出excel的实例代码
Aug 11 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
TensorFlow实现Batch Normalization
Mar 08 Python
Python爬虫包BeautifulSoup实例(三)
Jun 17 Python
python logging日志模块原理及操作解析
Oct 12 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Python if else条件语句形式详解
Mar 24 Python
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 #Python
采用python实现简单QQ单用户机器人的方法
Jul 03 #Python
centos系统升级python 2.7.3
Jul 03 #Python
python实现定制交互式命令行的方法
Jul 03 #Python
小结Python用fork来创建子进程注意事项
Jul 03 #Python
在Windows8上的搭建Python和Django环境
Jul 03 #Python
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 #Python
You might like
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
成品仓管员岗位职责
2013/12/11 职场文书
小学生评语集锦
2014/04/18 职场文书
无传销社区工作方案
2014/05/13 职场文书
环境整治工作方案
2014/05/18 职场文书
工地标语大全
2014/06/18 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
《司马光》教学反思
2016/02/22 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android