尝试用最短的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中使用第三方库xlrd来读取Excel示例
Apr 05 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
python斐波那契数列的计算方法
Sep 27 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
python如何将图片转换素描画
Sep 08 Python
Python实战之用tkinter库做一个鼠标模拟点击器
Apr 27 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 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
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
用console.table()调试javascript
2014/09/04 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
介绍Python中内置的itertools模块
2015/04/29 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python selenium自动化测试模型图解
2020/04/15 Python
python中类与对象之间的关系详解
2020/12/16 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
结构工程研究生求职信
2013/10/13 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
水电施工员岗位职责
2015/04/11 职场文书
亮剑观后感600字
2015/06/05 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书