proxy->forward。proxy" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

僅用50行Python代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代理服務(wù)器

系統(tǒng) 1951 0

之前遇到一個(gè)場(chǎng)景是這樣的:

我在自己的電腦上需要用mongodb圖形客戶端,但是mongodb的服務(wù)器地址沒有對(duì)外網(wǎng)開放,只能通過先登錄主機(jī)A,然后再從A連接mongodb服務(wù)器B。

本來想通過ssh端口轉(zhuǎn)發(fā)的,但是我沒有從機(jī)器A連接ssh到B的權(quán)限。于是就自己用python寫一個(gè)。

?

原理很簡(jiǎn)單。

1.開一個(gè)socket server監(jiān)聽連接請(qǐng)求

2.每接受一個(gè)客戶端的連接請(qǐng)求,就往要轉(zhuǎn)發(fā)的地址建一條連接請(qǐng)求。即client->proxy->forward。proxy既是socket服務(wù)端(監(jiān)聽client),也是socket客戶端(往forward請(qǐng)求)。

3.把client->proxy和proxy->forward這2條socket用字典給綁定起來。

4.通過這個(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)聽的地址 
  except KeyboardInterrupt: 
    sys.exit(1)

          


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 台山市| 蓬莱市| 南江县| 南投县| 太白县| 古丈县| 大港区| 黎城县| 龙门县| 三亚市| 田阳县| 渝中区| 白水县| 两当县| 万山特区| 林西县| 天津市| 富顺县| 河池市| 来安县| 区。| 红原县| 霍城县| 岳阳县| 怀来县| 揭西县| 葵青区| 江门市| 炉霍县| 霍州市| 桑日县| 科尔| 万安县| 全州县| 南丹县| 晋江市| 开阳县| 即墨市| 浦江县| 林甸县| 洞头县|