之前遇到一個(gè)場(chǎng)景是這樣的:
我在自己的電腦上需要用mongodb圖形客戶端,但是mongodb的服務(wù)器地址沒(méi)有對(duì)外網(wǎng)開(kāi)放,只能通過(guò)先登錄主機(jī)A,然后再?gòu)腁連接mongodb服務(wù)器B。
本來(lái)想通過(guò)ssh端口轉(zhuǎn)發(fā)的,但是我沒(méi)有從機(jī)器A連接ssh到B的權(quán)限。于是就自己用python寫(xiě)一個(gè)。
?
原理很簡(jiǎn)單。
1.開(kāi)一個(gè)socket server監(jiān)聽(tīng)連接請(qǐng)求
2.每接受一個(gè)客戶端的連接請(qǐng)求,就往要轉(zhuǎn)發(fā)的地址建一條連接請(qǐng)求。即client->proxy->forward。proxy既是socket服務(wù)端(監(jiān)聽(tīng)client),也是socket客戶端(往forward請(qǐng)求)。
3.把client->proxy和proxy->forward這2條socket用字典給綁定起來(lái)。
4.通過(guò)這個(gè)映射的字典把send/recv到的數(shù)據(jù)原封不動(dòng)的傳遞
?
下面上代碼。
?
#coding=utf-8 import socket import select import sys to_addr = ('xxx.xxx.xx.xxx', 10000)#轉(zhuǎn)發(fā)的地址 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()#代理服務(wù)器監(jiān)聽(tīng)的地址 except KeyboardInterrupt: sys.exit(1)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
