proxy->forward原理在socket模塊下編寫,需要的朋友可以參考下">

激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

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

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

2020-06-01 10:41腳本之家 Python

這篇文章主要介紹了僅用50行Python代碼實(shí)現(xiàn)一個(gè)簡單的代理服務(wù)器,利用最簡單的client->proxy->forward原理在socket模塊下編寫,需要的朋友可以參考下

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

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

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

 

原理很簡單。

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

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

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

4.通過這個(gè)映射的字典把send/recv到的數(shù)據(jù)原封不動的傳遞

 

下面上代碼。
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.99热视频| 性生活视频网站 | 黄色片免费在线 | 国产成人小视频在线观看 | 国产精品视频免费在线观看 | 一本色道久久综合狠狠躁篇适合什么人看 | 91福利国产在线观一区二区 | 国产在线观看91一区二区三区 | 在线看日本 | 亚洲午夜免费 | 欧美四级在线观看 | 免费看黄色一级片 | 久久久日韩av免费观看下载 | 成人毛片100部免费观看 | 久久伊 | 香蕉久草视频 | 香蕉国产精品 | 日韩精品久久久 | 成人做爰www免费看 欧美精品免费一区二区三区 | 国产精品久久久久久久四虎电影 | 欧美日韩大片在线观看 | 午夜精品在线视频 | 91免费影片 | 久草最新在线 | 久久亚洲春色中文字幕久久 | 久久激情国产 | 全黄性性激高免费视频 | 国产无遮挡一区二区三区毛片日本 | 成人视屏网站 | 伊人在线视频 | av免费在线播放 | 永久免费不卡在线观看黄网站 | 一级国产航空美女毛片内谢 | 国产毛毛片一区二区三区四区 | 欧美精品一区二区中文字幕 | 最新中文在线视频 | 亚洲精品一区中文字幕 | 久久福利在线 | 4p一女两男做爰在线观看 | 又黄又爽又色无遮挡免费 | 欧美成人精品一区 |