尝试用最短的Python代码来实现服务器和代理服务器

一个最简单的服务器
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()

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)

效果截图如下。

(0)

相关推荐

  • python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)

    UDP广泛应用于需要相互传输数据的网络应用中,如QQ使用的就是UDP协议.在网络质量不好的情况下,使用UDP协议时丢包现象十分严重,但UDP占用资源少,处理速度快,UDP依然是传输数据时常用的协议. 下面是用python实现UDP服务器的代码: 复制代码 代码如下: #!/usr/bin/env pythonimport socketaddress=('127.0.0.1',10000)s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind

  • 使用C语言来扩展Python程序和Zope服务器的教程

    有几个原因使您可能想用 C 扩展 Zope.最可能的是您有一个已能帮您做些事的现成的 C 库,但是您对把它转换成 Python 却不感兴趣.此外,由于 Python 是解释性语言,所以任何被大量调用的 Python 代码都将降低您的速度.因此,即使您已经用 Python 写了一些扩展,您仍然要考虑把其中最常被调用的部分改用 C 来写.不论哪种方式,扩展 Zope 都是从扩展 Python 开始.此外,扩展 Python 会给您带来其它的好处,因为您的代码将可以从任何 Python 脚本访问,而不

  • Python使用Paramiko模块编写脚本进行远程服务器操作

    简介: paramiko是python(2.2或更高)的模块,遵循SSH2协议实现了安全(加密和认证)连接远程机器. 安装所需软件包: http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.5.tar.gz http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz tar zxvf pycrypto-2.5.tar.gz cd pycrypto-2.5 python se

  • Python基于select实现的socket服务器

    本文实例讲述了Python基于select实现的socket服务器.分享给大家供大家参考,具体如下: 借鉴了asyncore模块中select.select的使用方法 import socket import traceback import select EOL1 = b'\n\n' EOL2 = b'\n\r\n' socketmap = {} r,w,e = [],[],[] response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:

  • python服务器端收发请求的实现代码

    最近学习了python的一些服务器端编程,记录在此. 发送get/post请求 # coding:utf-8 import httplib,urllib #加载模块 #urllib可以打开网站去拿 #res = urllib.urlopen('http://baidu.com'); #print res.headers #定义需要进行发送的数据 params = urllib.urlencode({'param':'6'}); #定义一些文件头 headers = {"Content-Type&

  • python实现可将字符转换成大写的tcp服务器实例

    本文实例讲述了python实现可将字符转换成大写的tcp服务器.分享给大家供大家参考.具体分析如下: 下面的python代码执行后通过tcp监控8081端口,用于将用户发送的请求字符串转换成大写后返回,如果用户发送的是end,则中断连接 import SocketServer import netstring class MyRequestHandler(SocketServer.BaseRequestHandler): def handle(self): print "From:",

  • 在阿里云服务器上配置CentOS+Nginx+Python+Flask环境

    项目运行环境 阿里云(单核CPU, 1G内存, Ubuntu 14.04 x64 带宽1Mbps), 具体购买和ssh连接阿里云本文不做描述. 实用工具 首先进入阿里云后先要升级下apt-get, 并下载所需软件 sudo apt-get update sudo apt-get install vim git wget tmux 我还会使用zsh和oh-my-zsh来替换bash sudo apt-get install zsh # 终端下打以下命令 wget --no-check-certif

  • Python实现检测服务器是否可以ping通的2种方法

    好想在2014结束前再赶出个10篇博文来,~(>_<)~,不写博客真不是一个好兆头,至少说明对学习的欲望和对知识的研究都不是那么积极了,如果说这1天的时间我能赶出几篇精致的博文,你们信不信,哈哈,反正我是信了... python检测服务器是否ping通的2种方法 1.第一种比较挫,就是用ping,python调用shell,这个适用于较少的服务器数量,几百台已经很慢了(当然是说python同步的方法,要是nodejs异步方式还是很快的,但是nodejs CPU计算不行,所以尝试了下只能200台

  • Python Web服务器Tornado使用小结

    首先想说的是它的安全性,这方面确实能让我感受到它的良苦用心.这主要可以分为两点: 一.防范跨站伪造请求(Cross-site request forgery,简称 CSRF 或 XSRF) CSRF 的意思简单来说就是,攻击者伪造真实用户来发送请求. 举例来说,假设某个银行网站有这样的 URL:http://bank.example.com/withdraw?amount=1000000&for=Eve当这个银行网站的用户访问该 URL 时,就会给 Eve 这名用户一百万元.用户当然不会轻易地点

  • 尝试用最短的Python代码来实现服务器和代理服务器

    一个最简单的服务器 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) r

  • 仅用50行Python代码实现一个简单的代理服务器

    之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B. 本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限.于是就自己用python写一个. 原理很简单. 1.开一个socket server监听连接请求 2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求.即client->proxy->forward.proxy既是socket服务端(监

  • 在Linux下调试Python代码的各种方法

    这是一个我用于调试或分析工具概述,不一定是完整全面,如果你知道更好的工具,请在评论处标记. 日志 是的,的确,不得不强调足够的日志记录对应用程序是多么的重要.您应该记录重要的东西,如果你的记录足够好的话,你可以从日志中找出问题从而节省大量的时间. 如果你曾经用print语句来调试代码现在停下吧,用logging.debug替代,开始可以慢慢来,以后完全禁用它... 追踪 有时看到程序如何被执行会很有帮助.你可以使用IDE的调试共轭ngn一步一步的运行程序,但你需要知道你要找的是什么,否则这将会是

  • 让Python代码更快运行的5种方法

    不论什么语言,我们都需要注意性能优化问题,提高执行效率.选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮.尽管Python从未如C和Java一般快速,但是不少Python项目都处于开发语言领先位置. Python很简单易用,但大多数人使用Python都知道在处理密集型cpu工作时,它的数量级依然低于C.Java和JavaScript.但不少第三方不愿赘述Python的优点,而是决定自内而外提高其性能.如果你想让Python在同一

  • 优化Python代码使其加快作用域内的查找

    我将示范微优化(micro optimization)如何提升python代码5%的执行速度.5%!同时也会触怒任何维护你代码的人. 但实际上,这篇文章只是解释一下你偶尔会在标准库或者其他人的代码中碰到的代码.我们先看一个标准库的例子,collections.OrderedDict类: def __setitem__(self, key, value, dict_setitem=dict.__setitem__): if key not in self: root = self.__root l

  • 教你用一行Python代码实现并行任务(附代码)

    Python在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题.常见的经典Python多线程.多进程教程多显得偏"重".而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容. 传统的例子 简单搜索下"Python多线程教程",不难发现几乎所有的教程都给出涉及类和队列的例子: #Example.py ''' Standard Producer/Consumer Threading Pattern ''' imp

  • 使用Python代码实现Linux中的ls遍历目录命令的实例代码

    一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://www.jb51.net/it/692145.html,在这篇文章中,有这样一段话,吸引了我的注意: 在 Linux 中 ls 是一个使用频率非常高的命令了,可选的参数也有很多, 算是一条不得不掌握的命令.Python 作为一门简单易学的语言,被很多人认为是不需要认真学的,或者只是随便调个库就行了,那可就真是小瞧 Python 了.那这次我就要试着用 Python 来实现一下 Linux 中的 ls 命令, 小小地证明下 Py

  • 使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym,只使用 Numpy 来创建 agent. 各位看官好,我(作者 Mike Shi--译者注)将在本文教大家如何用 50 行 Python 代码,教会 AI 玩一个简单的平衡游戏.我们会用到标准的 OpenAI Gym 作为测试环境,仅用 Numpy 创建我们的 AI,别的不用. 这个小游戏就是经典的

  • 100行python代码实现跳一跳辅助程序

    写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分享.接下来要分享的是用"纯软件"的方法来玩"跳一跳". 原理 原理其实很简单,按如下步骤操作即可: 每次跳跃之前,截取一下手机屏幕,并将截图保存到本地电脑中: 计算截图中人偶的位置与将要跳至的台面中心的距离dd: 将以上距离dd换算成相应的触摸时间ss: 发送模拟触摸的

  • 在notepad++中实现直接运行python代码

    第一次使用python,之前都是学习的C++.不过,根据之前学习python基础知识的经验,感觉python用起来会很方便. 先下载了python软件,感觉python下起来很简单,没有那么多复杂的选项,很快就下载好了.另外,建议再下载一个与之相关的Notepad++,会很方便.如果gitHub中下载的python文件或者其他文件,可以先在notepad++中打开,因为python是逐步输入代码的那种,而且还不能crtl+v进行复制. 1. 如何在notepad++中直接运行python的代码

随机推荐