尝试用最短的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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
python二分法实现实例
Nov 21 Python
win7安装python生成随机数代码分享
Dec 27 Python
python提取内容关键词的方法
Mar 16 Python
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
python实现决策树ID3算法的示例代码
May 30 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
pytorch自定义二值化网络层方式
Jan 07 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 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报表之jpgraph柱状图实例代码
2011/08/22 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
python实现名片管理系统
2018/11/29 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
Python enumerate内置库用法解析
2020/02/24 Python
关于Django Models CharField 参数说明
2020/03/31 Python
django使用channels实现通信的示例
2020/10/19 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
大学生毕业自荐信
2013/10/10 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
毕业生求职信范文
2014/06/29 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
工作服管理制度范本
2015/08/06 职场文书