Home >Backend Development >Python Tutorial >Try to implement server and proxy server with the shortest Python code

Try to implement server and proxy server with the shortest Python code

WBOY
WBOYOriginal
2016-07-06 13:29:501206browse

The simplest server
Python has the ability to set up a separate server listening port, just use wsgiref of the standard library.

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 lines of code to implement proxy server
I encountered a scene before like this:
I need to use the mongodb graphical client on my computer, but the mongodb server address is not open to the outside world. I can only log in to host A first, and then connect to mongodb server B from A.
I originally wanted to forward through the ssh port, but I don't have the permission to connect ssh from machine A to B. So I wrote one myself in Python.
The principle is simple.
1. Open a socket server to listen for connection requests
2. Every time a connection request from a client is accepted, a connection request is created to the address to be forwarded. That is client->proxy->forward. The proxy is both a socket server (listening client) and a socket client (forward request).
3. Bind the two sockets client->proxy and proxy->forward with a dictionary.
4. Pass the data sent/recv intact through this mapped dictionary
Code below.

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

The screenshot of the effect is as follows.

2016623145635171.jpg (574×128)

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn