仅用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单例模式实例分析
Apr 08 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
python3转换code128条形码的方法
Apr 17 Python
Python编程中类与类的关系详解
Aug 08 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
python tkinter组件摆放方式详解
Sep 16 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
Python3实现建造者模式的示例代码
Jun 28 Python
Python使用openpyxl复制整张sheet
Mar 24 Python
pytorch 中nn.Dropout的使用说明
May 20 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 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
模仿OSO的论坛(二)
2006/10/09 PHP
如何使用脚本模仿登陆过程
2006/11/22 PHP
php Rename 更改文件、文件夹名称
2011/05/24 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
Python备份Mysql脚本
2008/08/11 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
珍惜资源的建议书
2014/08/26 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书