尝试用最短的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 help()函数用法详解
Mar 11 Python
Python os模块介绍
Nov 30 Python
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python写的一个简单监控系统
Jun 19 Python
python操作redis的方法
Jul 07 Python
Python计算字符宽度的方法
Jun 14 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
Django 对象关系映射(ORM)源码详解
Aug 06 Python
python命名空间(namespace)简单介绍
Aug 10 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 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/11/25 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
浅析Python中的for 循环
2016/06/09 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
用python读取xlsx文件
2020/12/17 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
高性能装备提升营地:Kammok
2019/02/27 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
大学生求职信
2014/06/17 职场文书
公司授权委托书范本
2014/09/18 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
毕业论文致谢信
2015/05/14 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
python利用while求100内的整数和方式
2021/11/07 Python
Redis基本数据类型List常用操作命令
2022/06/01 Redis