仅用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 相关文章推荐
web.py在模板中输出美元符号的方法
Aug 26 Python
python中正则表达式的使用详解
Oct 17 Python
Python文件右键找不到IDLE打开项解决办法
Jun 08 Python
Python正则替换字符串函数re.sub用法示例
Jan 19 Python
python实现按长宽比缩放图片
Jun 07 Python
python flask实现分页的示例代码
Aug 02 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
python tkinter窗口最大化的实现
Jul 15 Python
python之生成多层json结构的实现
Feb 27 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 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
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
vue实现购物车列表
2020/06/30 Javascript
Python httplib模块使用实例
2015/04/11 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
python获取url的返回信息方法
2018/12/17 Python
python三大神器之fabric使用教程
2019/06/10 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
校外活动方案
2014/08/28 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
简单租房协议书
2014/10/21 职场文书
婚宴主持词
2015/06/30 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android
Python MNIST手写体识别详解与试练
2021/11/07 Python