尝试用最短的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赋值语句后逗号的作用分析
Jun 08 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 Python
在windows系统中实现python3安装lxml
Mar 23 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
解决Python3下map函数的显示问题
Dec 04 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
python OpenCV学习笔记
Mar 31 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
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
利用python实现命令行有道词典的方法示例
2017/01/31 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python生成器generator用法示例
2018/08/10 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
九年级语文教学反思
2014/02/04 职场文书
聘任书模板
2014/03/29 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
JavaScript的function函数详细介绍
2021/11/20 Javascript
深入理解pytorch库的dockerfile
2022/06/10 Python