仅用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中让MySQL查询结果返回字典类型的方法
Aug 22 Python
python检测远程服务器tcp端口的方法
Mar 14 Python
基于Python的接口测试框架实例
Nov 04 Python
安装Python的教程-Windows
Jul 22 Python
深入理解Python单元测试unittest的使用示例
Nov 18 Python
Python绘制正余弦函数图像的方法
Aug 28 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
详解Python中namedtuple的使用
Apr 27 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
Python环境配置实现pip加速过程解析
Nov 27 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+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
写出高质量的PHP程序
2012/02/04 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
php取出数组单个值的方法
2018/03/12 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
分享python数据统计的一些小技巧
2016/07/21 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
小学运动会入场式解说词
2014/02/18 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python