尝试用最短的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中的进程、线程、协程
Mar 18 Python
TensorFlow实现创建分类器
Feb 06 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
python将一组数分成每3个一组的实例
Nov 14 Python
python面向对象法实现图书管理系统
Apr 19 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
opencv python图像梯度实例详解
Feb 04 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
python 从list中随机取值的方法
Nov 16 Python
Python基础之字符串格式化详解
Apr 21 Python
你需要掌握的20个Python常用技巧
Feb 28 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
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
php操作redis缓存方法分享
2015/06/03 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
Vue异步加载about组件
2017/10/31 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
vue实现图片上传功能
2020/05/28 Javascript
原生js实现随机点名
2020/07/05 Javascript
python实现下载指定网址所有图片的方法
2015/08/08 Python
python列表list保留顺序去重的实例
2018/12/14 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
pytorch 模型可视化的例子
2019/08/17 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
一套.net面试题及答案
2016/11/02 面试题
大学生个人实习的自我评价
2014/02/15 职场文书
学习经验交流会主持词
2014/04/01 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
工作简历自我评价
2015/03/11 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书