尝试用最短的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使用Pandas模块操作Excel文件的教程
May 31 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
Python hashlib模块用法实例分析
Jun 12 Python
python版大富翁源代码分享
Nov 19 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
python实现五子棋小程序
Jun 18 Python
如何通过python实现全排列
Feb 11 Python
python3正则模块re的使用方法详解
Feb 11 Python
django使用JWT保存用户登录信息
Apr 22 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
Python实现区域填充的示例代码
Feb 03 Python
Python中json.dumps()函数的使用解析
May 17 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 echo 输出字符串函数详解
2010/05/13 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
python3中int(整型)的使用教程
2017/03/23 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
Python线性回归实战分析
2018/02/01 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
小孩百日宴答谢词
2014/01/15 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
活动总结格式
2014/08/30 职场文书
新员工入职欢迎词
2015/01/23 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
《植树问题》教学反思
2016/03/03 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Java集成swagger文档组件
2021/06/28 Java/Android