Python實現HTTP代理服務器

jopen 11年前發布 | 5K 次閱讀 Python 驗證碼

這些天閑來無事就研究了下HTTP代理原理,順便用Python做了個很挫的程序。

先來說說代理,所謂代理其實跟帶話差不多。比方說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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!