尝试用最短的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之再深点,更懂list
Sep 20 Python
Python实现从url中提取域名的几种方法
Sep 26 Python
初步理解Python进程的信号通讯
Apr 09 Python
python处理二进制数据的方法
Jun 03 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
python对DICOM图像的读取方法详解
Jul 17 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
简单了解python高阶函数map/reduce
Jun 28 Python
Python tkinter和exe打包的方法
Feb 05 Python
Python代码需要缩进吗
Jul 01 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 Python
python实现简单的井字棋
May 26 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对象相关知识总结
2017/04/09 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python程序退出方式小结
2017/12/09 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
python实现机器学习之元线性回归
2018/09/06 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
Python项目跨域问题解决方案
2020/06/22 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
合作意向书范本
2014/03/31 职场文书
公司晚会策划方案
2014/05/17 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
上下班时间调整通知
2015/04/23 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python