仅用50行Python代码实现一个简单的代理服务器


Posted in Python onApril 08, 2015

之前遇到一个场景是这样的:

我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B。

本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限。于是就自己用python写一个。

 

原理很简单。

1.开一个socket server监听连接请求

2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求。即client->proxy->forward。proxy既是socket服务端(监听client),也是socket客户端(往forward请求)。

3.把client->proxy和proxy->forward这2条socket用字典给绑定起来。

4.通过这个映射的字典把send/recv到的数据原封不动的传递

 

下面上代码。
 

#coding=utf-8 
import socket 
import select 
import sys 
  
to_addr = ('xxx.xxx.xx.xxx', 10000)#转发的地址 
  
class Proxy: 
  def __init__(self, addr): 
    self.proxy = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
    self.proxy.bind(addr) 
    self.proxy.listen(10) 
    self.inputs = [self.proxy] 
    self.route = {} 
  
  def serve_forever(self): 
    print 'proxy listen...' 
    while 1: 
      readable, _, _ = select.select(self.inputs, [], []) 
      for self.sock in readable: 
        if self.sock == self.proxy: 
          self.on_join() 
        else: 
          data = self.sock.recv(8096) 
          if not data: 
            self.on_quit() 
          else: 
            self.route[self.sock].send(data) 
  
  def on_join(self): 
    client, addr = self.proxy.accept() 
    print addr,'connect' 
    forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    forward.connect(to_addr) 
    self.inputs += [client, forward] 
    self.route[client] = forward 
    self.route[forward] = client 
  
  def on_quit(self): 
    for s in self.sock, self.route[self.sock]: 
      self.inputs.remove(s) 
      del self.route[s] 
      s.close() 
  
if __name__ == '__main__': 
  try: 
    Proxy(('',12345)).serve_forever()#代理服务器监听的地址 
  except KeyboardInterrupt: 
    sys.exit(1)
Python 相关文章推荐
Python的组合模式与责任链模式编程示例
Feb 02 Python
利用Python读取文件的四种不同方法比对
May 18 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
python使用udp实现聊天器功能
Dec 10 Python
Python中psutil的介绍与用法
May 02 Python
基于python的Paxos算法实现
Jul 03 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
Python 列表反转显示的四种方法
Nov 16 Python
pytorch model.cuda()花费时间很长的解决
Jun 01 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 #Python
Python 创建子进程模块subprocess详解
Apr 08 #Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 #Python
Python使用scrapy抓取网站sitemap信息的方法
Apr 08 #Python
Python中用format函数格式化字符串的用法
Apr 08 #Python
简单介绍Python中的JSON模块
Apr 08 #Python
Python实现把xml或xsl转换为html格式
Apr 08 #Python
You might like
十天学会php之第八天
2006/10/09 PHP
一个php作的文本留言本的例子(二)
2006/10/09 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
js中开关变量使用实例
2017/02/24 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
技术合作协议书范本
2014/04/18 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书