尝试用最短的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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
Python合并字符串的3种方法
May 21 Python
Python多进程并发(multiprocessing)用法实例详解
Jun 02 Python
python 打印对象的所有属性值的方法
Sep 11 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
详解python中的json和字典dict
Jun 22 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
Python实现七个基本算法的实例代码
Oct 08 Python
Python如何telnet到网络设备
Feb 18 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
简单实例处理url特殊符号&处理(2种方法)
2013/04/02 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
Python 时间处理datetime实例
2008/09/06 Python
使用Python下载Bing图片(代码)
2013/11/07 Python
Python实现全局变量的两个解决方法
2014/07/03 Python
Python编程之属性和方法实例详解
2015/05/19 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
线程同步的方法
2016/11/23 面试题
应届生高等护理求职信
2013/10/12 职场文书
给小学生的新年寄语
2014/04/04 职场文书
家长会主持词开场白
2015/05/29 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
检讨书怎么写?
2019/06/21 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis
用JS写一个发布订阅模式
2021/11/07 Javascript