尝试用最短的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程序与C程序的结合使用
Apr 07 Python
Python httplib模块使用实例
Apr 11 Python
Python自定义类的数组排序实现代码
Aug 28 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
Python多线程thread及模块使用实例
Apr 28 Python
理解深度学习之深度学习简介
Apr 14 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 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 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
基于jQuery的动态表格插件
2011/03/28 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
Python二元算术运算常用方法解析
2020/09/15 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
初任培训自我鉴定
2013/10/07 职场文书
房产委托公证书样本
2014/04/04 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
导游词之介休绵山
2019/12/31 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
Python实现打乒乓小游戏
2021/09/25 Python