Home >Backend Development >Python Tutorial >Try to implement server and proxy server with the shortest Python code
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()
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.