尝试用最短的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求众数问题实例
Sep 26 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
Django数据库表反向生成实例解析
Feb 06 Python
用python实现k近邻算法的示例代码
Sep 06 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
Python必须了解的35个关键词
Jul 16 Python
Python类成员继承重写的实现
Sep 16 Python
Python装饰器的练习题
Nov 23 Python
pytorch中的 .view()函数的用法介绍
Mar 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中显示格式化的用户输入
2006/10/09 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
php实现的操作excel类详解
2016/01/15 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
2007/04/20 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
js实现随机数小游戏
2019/06/28 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中sys模块功能与用法实例详解
2020/02/26 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
python 星号(*)的多种用途
2020/09/21 Python
介绍一下你对SOA的认识
2016/04/24 面试题
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
经理秘书岗位职责
2013/11/14 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
软件售后服务承诺书
2014/05/21 职场文书
学校宣传标语
2014/06/18 职场文书
统计员岗位职责
2015/02/11 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers