尝试用最短的Python代码来实现服务器和代理服务器


Posted in Python onJune 23, 2016

一个最简单的服务器
Python拥有这种单独起一个服务器监听端口的能力,用标准库的wsgiref就行。

from wsgiref.simple_server import make_server 
def simple_app(environ, start_response): 
  status = '200 OK' 
  response_headers = [('Content-type','text/plain')] 
  start_response(status, response_headers) 
  return ['Hello world!\n'] 
httpd = make_server('', 80, simple_app) 
httpd.serve_forever()

尝试用最短的Python代码来实现服务器和代理服务器

50行代码实现代理服务器
之前遇到一个场景是这样的:
我在自己的电脑上需要用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 相关文章推荐
python基础教程之数字处理(math)模块详解
Mar 25 Python
python Django批量导入不重复数据
Mar 25 Python
Django权限机制实现代码详解
Feb 05 Python
python编辑用户登入界面的实现代码
Jul 16 Python
Python绘制频率分布直方图的示例
Jul 08 Python
pytorch索引查找 index_select的例子
Aug 18 Python
在python中求分布函数相关的包实例
Apr 15 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
python文件读取失败怎么处理
Jun 23 Python
python 装饰器的使用示例
Oct 10 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
Python基础篇之初识Python必看攻略
Jun 23 #Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 #Python
浅谈Python中用datetime包进行对时间的一些操作
Jun 23 #Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 #Python
python中的lambda表达式用法详解
Jun 22 #Python
深入浅析python中的多进程、多线程、协程
Jun 22 #Python
Python按行读取文件的简单实现方法
Jun 22 #Python
You might like
十天学会php之第三天
2006/10/09 PHP
php 5.3.5安装memcache注意事项小结
2011/04/12 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
Python 初始化多维数组代码
2008/09/06 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
使用python3构建文件传输的方法
2019/02/13 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
python如何变换环境
2020/07/21 Python
学习Python需要哪些工具
2020/09/04 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
C面试题
2015/10/08 面试题
星空联盟C# .net笔试题
2014/12/05 面试题
旷课检讨书大全
2014/01/21 职场文书
汽车专业求职信
2014/06/05 职场文书
商场营业员岗位职责
2015/04/14 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书