SocketServer ——網路通訊伺服器

發表於2017-09-20

SocketServer是Python標準庫中的一個模組,其作用是建立網路伺服器。SocketServer模組定義了一些類來處理諸如TCP、UDP、UNIX流和UNIX資料包之上的同步網路請求。

SocketServer模組處理網路請求的功能,可以通過兩個主要的類來實現:一個是伺服器類,一個是請求處理類。

  • 伺服器類 處理通訊問題,如監聽一個套接字並接收連線等;
  • 請求處理類 處理“協議”問題,如解釋到來的資料、處理資料並把資料發回給客戶端等。

這種實現將伺服器的實現過程和請求處理的實現過程解耦,這意味著我們可以將不同的伺服器實現和請求處理實現結合起來來處理一些定製的協議,例如一個TCP伺服器類和一個流請求處理類結合,處理基於TCP的網路請求。同時,也可以基於SocketServer模組中的伺服器類和請求處理類,實現網路層之上應用層的伺服器和請求處理實現,例如基於TCP伺服器類實現HTTP伺服器,基於流處理請求類實現HTTP請求處理類等。

伺服器類

SocketServer模組中定義了五種伺服器類。

  • BaseServer(伺服器的基類,定義了API)
  • TCPServer(使用TCP/IP套接字)
  • UDPServer(使用資料包套接字)
  • UnixStreamServer(使用UNIX域套接字,只適用UNIX平臺)
  • UnixDatagramServer(使用UNIX域套接字,只適用UNIX平臺)

1. 構造伺服器物件

要構建一個伺服器物件,需要向它傳遞一個地址server_address(伺服器將在這個地址上監聽請求),以及一個請求處理類RequestHandlerClass(不是請求處理例項)。伺服器類基類的建構函式如下:

之後,可以構造TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer。其中,TCPServer繼承自BaseServer,UDPServer和UnixStreamServer繼承自TCPServer,UnixDatagramServer繼承自UDPServer。各個伺服器型別可以根據自己的特點對基類進行擴充套件,例如建立監聽套接字、繫結監聽地址和埠、進行監聽等。一旦例項化伺服器物件,便可以使用伺服器的方法來監聽和處理請求。

2. 實現伺服器

由於SocketServer模組中定義的五種伺服器類中,除了基類BaseServer和TCPServer外,其餘的三個類都是直接或間接地繼承自TCPServer。因此,以下以TCPServer的實現過程為例進行說明。

  1. 構造TCPServer。 構造TCPServer時,建構函式建立了一個套接字(這個套接字可以通過更改地址簇和型別用於其他伺服器)用於監聽請求。並且呼叫server_bind()繫結監聽的地址和埠,呼叫server_activate()開始監聽。
  2. 啟動伺服器。 伺服器例項化後,可以使用serve_forever()或者handle_request()來監聽和處理請求,實現伺服器功能。這兩個方法的具體實現依賴於_handle_request_noblock()方法。這個方法是BaseServer類中定義的。具體實現如下:
  3. 處理請求。 根據上一步驟啟動伺服器後,伺服器便開始監聽請求。如果接收到請求資訊,便開始處理請求。由_handle_request_noblock()可以看出有幾個函式比較重要。
  • get_request() ——這個函式可以在子類中重寫。在TCPServer中,該函式呼叫監聽套接字的accept()方法,返回請求request和客戶端地址client_address
  • verify_request(request, client_address) ——這個函式可以在子類中重寫。該函式返回True表示處理請求,返回False表示忽略請求。
  • process_request(request, client_address) ——這個函式可以在子類中重寫。該函式將呼叫finish_request()具體完成請求的處理過程,並且在處理完請求後關閉請求。
  • finish_request(request, client_address) ——該函式將構造一個請求處理類的例項。請求處理類被例項化後將呼叫其handle()方法處理請求。

3. 程式/執行緒支援

SocketServer模組中還提供了一些”mix-in”類:ForkingMixInThreadingMixIn。這些類可以和伺服器類混合使用,很容易改變伺服器,為每個請求使用一個單獨的程式或執行緒。具體的伺服器類有:

  • class ForkingUDPServer(ForkingMixIn, UDPServer)
  • class ForkingTCPServer(ForkingMixIn, TCPServer)
  • class ThreadingUDPServer(ThreadingMixIn, UDPServer)
  • class ThreadingTCPServer(ThreadingMixIn, TCPServer)
  • class ThreadingUnixStreamServer(ThreadingMixIn, UnixStreamServer)
  • class ThreadingUnixDatagramServer(ThreadingMixIn, UnixDatagramServer)

請求處理類

要接收到來的請求以及確定採取什麼行動,其中大部分的工作都是由請求處理類完成的。請求處理類負責在套接字層之上實現協議。具體過程為:讀取請求、處理請求、寫回響應。請求處理類基類中定義了3個方法,子類中需要重寫。

  • setup() ——為請求準備請求處理器
  • handle() ——對請求完成具體的工作。諸如解析到來的請求,處理資料,併發迴響應等。
  • finish() ——清理setup()期間建立的所有資料

相關文章