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

php中文网
发布: 2016-07-06 13:29:50
原创
1387人浏览过

一个最简单的服务器
Python拥有这种单独起一个服务器监听端口的能力,用标准库的wsgiref就行。

1

2

3

4

5

6

7

8

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()

登录后复制

2016623145600293.jpg (247×67)

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到的数据原封不动的传递
下面上代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

#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)

登录后复制

效果截图如下。

2016623145635171.jpg (574×128)

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号