国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

僅用50行Python代碼實現一個簡單的代理服務器

2019-11-25 17:48:48
字體:
來源:轉載
供稿:網友

之前遇到一個場景是這樣的:

我在自己的電腦上需要用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)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 唐海县| 林周县| 罗甸县| 个旧市| 无为县| 汝州市| 临高县| 临潭县| 万荣县| 吴旗县| 卢龙县| 鲁甸县| 博罗县| 新郑市| 方正县| 崇信县| 安岳县| 福州市| 贵南县| 天柱县| 南京市| 陆良县| 新晃| 叶城县| 育儿| 曲沃县| 肥乡县| 皮山县| 共和县| 乡城县| 西藏| 吴旗县| 高邮市| 和顺县| 英山县| 辉县市| 潜江市| 当雄县| 武威市| 红桥区| 朝阳区|