尝试用最短的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使用htmllib分析网页内容的方法
May 08 Python
Python中datetime常用时间处理方法
Jun 15 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 Python
python实现扫描ip地址的小程序
Apr 16 Python
python中的&&及||的实现示例
Aug 07 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
浅谈Python 函数式编程
Jun 20 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 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
与数据库连接
2006/10/09 PHP
PHP中的string类型使用说明
2010/07/27 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
js 替换
2008/02/19 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
python多线程抓取天涯帖子内容示例
2014/04/03 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Django中Middleware中的函数详解
2019/07/18 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
护理自荐信范文
2013/10/05 职场文书
男方父母证婚词
2014/01/12 职场文书
市场营销管理制度
2014/01/29 职场文书
家属答谢词
2015/01/05 职场文书
活动新闻稿范文
2015/07/17 职场文书
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL