尝试用最短的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 相关文章推荐
windows系统中python使用rar命令压缩多个文件夹示例
May 06 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
Python循环语句中else的用法总结
Sep 11 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
python Pandas 读取txt表格的实例
Apr 29 Python
numpy.random模块用法总结
May 27 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
python从PDF中提取数据的示例
Oct 30 Python
python实现发送QQ邮件(可加附件)
Dec 23 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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对象Object的概念 介绍
2012/06/14 PHP
php实现水仙花数示例分享
2014/04/03 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
Python中用于计算对数的log()方法
2015/05/15 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
Python多线程多进程实例对比解析
2020/03/12 Python
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
七年级音乐教学反思
2014/01/26 职场文书
银行服务感言
2014/03/01 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
工会文体活动总结
2015/05/07 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang