Python實現HTTP代理服務器
先來說說代理,所謂代理其實跟帶話差不多。比方說A要跟C通信,但A和C之間沒有通信渠道,這個時候就需要有一個和AC都能通信的中間人B來中轉信息。搞懂了這個之后就需要考慮如何實現這樣的一個代理服務器。
代理服務器必須得響應客戶端請求,因此要建立一個監聽Socket來接受客戶端連接請求,y由于客戶端不可能只有一個(因為就算一臺電腦只有1個IP但他在訪問網站時都會有很多端口同時連接上服務器),所以我們的代理服務器就得為每個客戶端轉發他們的數據,在程序的實現上多線程技術必不可少。
下面給出偽代碼
import socket
import threading
class ProxyServer():
def __init__(self):
self.ListenSock = socket()
self.ListenSock.bind()
self.Clients = []
def listen_thread(self):
self.ListenSock.listen()
while(1):
self.Clients.append(ProxyClient(self.ListenSock.accpet())
def start_work(self):
start listen_thread
while(1):
#從內存中踢出已經斷開的連接
for i in self.client:
if i not alive:
self.clients.remove(i)
上面偽代碼中的ProxyClient就是處理每個客戶端的類
class ProxyClient():
def __init__(self, Csock):
self.Csock = Csock
self.Rsock = None
start request_process_thread
def request_process_thread(self):
while(1):
req = self.Csock.recv()
#客戶端斷開了
if req == '':
return
#從請求中獲得客戶端想要訪問的地址
addr = get addr from req
if self.Rsock == None:
self.Rsock.connect(addr)
#把客戶端的請求轉出去
self.Rscok.send(req)
#開啟接受web data的線程,把web data轉發給客戶端
start recv_web_data_thread
else:
#如果連接已經建立就不要再去創建新的
self.Rsock.send(req)
def recv_web_data_thread(self):
while(1):
data = self.Rsock.recv()
if data=='':
return
#把web data轉發給客戶端
self.Csock.send(data)
需要注意的是上面中的函數都需要加入try/except,不然就到處是異常退出了。另外ProxyClient中只有一個Rsock來訪問web。如果是個SocketServer,那么它可以與多個客戶端保持連接,但是一個Client只能連接上一個Server,Socket中的connect指定的地址也就一個。
原文地址:
Python實現HTTP代理服務器
作者:
大地瓜
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!