尝试用最短的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内置数据类型详解
Aug 18 Python
python实现将内容分行输出
Nov 05 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
详解【python】str与json类型转换
Apr 29 Python
春节到了 教你使用python来抢票回家
Jan 06 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
Python中的整除和取模实例
Jun 03 Python
Python为何不支持switch语句原理详解
Oct 21 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
浅谈Python项目的服务器部署
Apr 25 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 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
php4与php5的区别小结(配置异同)
2011/12/20 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
python复制文件代码实现
2013/12/23 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
python如何查看安装了的模块
2020/06/23 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
逻辑链路控制协议
2016/10/01 面试题
写自荐信三大法宝
2014/01/24 职场文书
成绩单公证书
2014/04/10 职场文书
保护环境倡议书500字
2014/05/19 职场文书
个人年终总结范文
2015/03/09 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js