仅用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实现比较两个文件夹中代码变化的方法
Jul 10 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 Python
Python实现遍历目录的方法【测试可用】
Mar 22 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
python实现淘宝购物系统
Oct 25 Python
Python如何计算语句执行时间
Nov 22 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
python轮询机制控制led实例
May 03 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
Python Unittest原理及基本使用方法
Nov 06 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
收音机指标测试方法及仪器
2021/03/01 无线电
S900/ ETON E1-XM 收音机
2021/03/02 无线电
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
JQuery AJAX 中文乱码问题解决
2013/06/05 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
django之常用命令详解
2016/06/30 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
医学院学生的自我评价分享
2013/11/19 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
违反学校规定检讨书
2014/01/18 职场文书
全国道德模范事迹
2014/02/01 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
婚内房产协议书范本
2014/10/02 职场文书
大学生毕业个人总结
2015/02/15 职场文书
追讨欠款律师函
2015/05/27 职场文书
简爱电影观后感
2015/06/10 职场文书