仅用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导出Excel图表以及导出为图片的方法
Nov 07 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
python pygame实现2048游戏
Nov 20 Python
python区块及区块链的开发详解
Jul 03 Python
python隐藏类中属性的3种实现方法
Dec 19 Python
Django实现随机图形验证码的示例
Oct 15 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
python 第三方库paramiko的常用方式
Feb 20 Python
Python 如何解决稀疏矩阵运算
May 26 Python
python​格式化字符串
Apr 20 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 setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
javascript 对象的定义方法
2007/01/10 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
Python中asyncore的用法实例
2014/09/29 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
Python button选取本地图片并显示的实例
2019/06/13 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
python绘制分布折线图的示例
2020/09/24 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
平面设计自荐信
2013/10/07 职场文书
公司市场部岗位职责
2013/12/02 职场文书
运动会广播稿150字
2014/02/19 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书