嘗試用最短的Python代碼來實現伺服器和Proxy 伺服器,最短python

來源:互聯網
上載者:User

嘗試用最短的Python代碼來實現伺服器和Proxy 伺服器,最短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行代碼實現Proxy 伺服器
之前遇到一個情境是這樣的:
我在自己的電腦上需要用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()#Proxy 伺服器監聽的地址   except KeyboardInterrupt:     sys.exit(1) 

效果如下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.