侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python实现网络端口转发和重定向的方法

Python  /  管理员 发布于 7年前   236

本文实例讲述了Python实现网络端口转发和重定向的方法。分享给大家供大家参考,具体如下:

【任务】

需要将某个网络端口转发到另一个主机(forwarding),但可能会是不同的端口(redirecting)。

【解决方案】

两个使用threading和socket模块的类就能完成我们需要的端口转发和重定向。

#encoding=utf8#author: walker摘自《Python Cookbook(2rd)》#date: 2015-06-11#function: 网络端口的转发和重定向(适用于python2/python3)import sys, socket, time, threadingLOGGING = Trueloglock = threading.Lock()#打印日志到标准输出def log(s, *a):  if LOGGING:    loglock.acquire()    try:      print('%s:%s' % (time.ctime(), (s % a)))      sys.stdout.flush()    finally:      loglock.release()class PipeThread(threading.Thread):  pipes = []   #静态成员变量,存储通讯的线程编号  pipeslock = threading.Lock()  def __init__(self, source, sink):    #Thread.__init__(self) #python2.2之前版本适用    super(PipeThread, self).__init__()    self.source = source    self.sink = sink    log('Creating new pipe thread %s (%s -> %s)',        self, source.getpeername(), sink.getpeername())    self.pipeslock.acquire()    try:      self.pipes.append(self)    finally:      self.pipeslock.release()    self.pipeslock.acquire()    try:      pipes_now = len(self.pipes)    finally:      self.pipeslock.release()    log('%s pipes now active', pipes_now)  def run(self):    while True:      try:        data = self.source.recv(1024)        if not data:          break        self.sink.send(data)      except:        break    log('%s terminating', self)    self.pipeslock.acquire()    try:      self.pipes.remove(self)    finally:      self.pipeslock.release()    self.pipeslock.acquire()    try:      pipes_left = len(self.pipes)    finally:      self.pipeslock.release()    log('%s pipes still active', pipes_left)class Pinhole(threading.Thread):  def __init__(self, port, newhost, newport):    #Thread.__init__(self) #python2.2之前版本适用    super(Pinhole, self).__init__()    log('Redirecting: localhost: %s->%s:%s', port, newhost, newport)    self.newhost = newhost    self.newport = newport    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    self.sock.bind(('', port))    self.sock.listen(5) #参数为timeout,单位为秒  def run(self):    while True:      newsock, address = self.sock.accept()      log('Creating new session for %s:%s', *address)      fwd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      fwd.connect((self.newhost, self.newport))      PipeThread(newsock, fwd).start() #正向传送      PipeThread(fwd, newsock).start() #逆向传送if __name__ == '__main__':  print('Starting Pinhole port fowarder/redirector')  try:    port = int(sys.argv[1])    newhost = sys.argv[2]    try:      newport = int(sys.argv[3])    except IndexError:      newport = port  except (ValueError, IndexError):    print('Usage: %s port newhost [newport]' % sys.argv[0])    sys.exit(1)  #sys.stdout = open('pinhole.log', 'w') #将日志写入文件  Pinhole(port, newhost, newport).start()

【讨论】

当你在管理一个网络时,即使是一个很小的网络,端口转发和重定向的功能有时也能给你很大的帮助。一些不在你的控制之下的应用或者服务可能是以硬连接的方式接入到某个特定的服务器的地址或端口。通过插入转发和重定向,你就能将对应用的连接请求发送到其他更合适的主机或端口上。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python URL操作技巧总结》、《Python Socket编程技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。


  • 上一条:
    Python自定义主从分布式架构实例分析
    下一条:
    Python中__init__.py文件的作用详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客