Python SocketServer源碼分析


1      XXXServer

1.1      BaseSever

提供基礎的循環等待請求的處理框架。使用serve_forever啟動服務,使用shutdown停止。同時提供了一些可自行擴展的方法,用於對不同類型的請求做自己想要的處理。

1.2      TCPServer

在BaseServer基礎上增加了一個TCP的socket連接,使用server_bind、server_activate、server_close處理TCP啟停等操作

同時增加了get_request、shutdown_request、close_request處理客戶端請求。

1.3      UDPServer

繼承自TCPServer,將socket改為了SOCK_DGRAM型,並修改了get_request,用於從SOCK_DGRAM中獲取request。

同時server_activate、shutdown_request、close_request都改成了空(UDP不需要),比TCP簡單一些。

2      XXXMixIn

2.1      ForkingMixIn

提供了process_request方法,每一個請求開啟一個新進程來處理

2.2      ThreadingMixIn

提供了process_request方法,每一個請求開啟一個新線程來處理

 

說明:

XXXMixIn專門提供process_request,用來覆蓋XXXServer的默認的process_request。(摻合模式:Mixin,可以看做一個設計模式,有點AOP的味道)

使用方法是,同時繼承XXXMinIn和XXXServer,例如標准庫的:

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

一個細節:XXXMixIn一點要寫在左側,XXXServer要寫在右側,這樣XXXMinIn里面的process_request方法才會覆蓋XXXServer的process_request方法。這個是由python的MRO決定的。

3      XXXRequestHandler

XXXServer在處理request時會調用RequestHandlerClass

self.RequestHandlerClass(request, client_address, self)

因此可以定義各種RequestHandlerClass,來實現對請求的處理。(組合。另一個設計模式?)

3.1      BaseRequestHandler

定義RequestHandlerClass的基本框架,包括三個成員變量:request、client_address、server;然后會依次調用setup()、handle()、finish(),子類可通過覆蓋這幾個函數實現不同功能。

3.2      StreamRequestHandler

最主要的功能是根據socket生成了讀寫socket用的兩個文件對象(可以理解為句柄)rfile和wfile

3.3      DatagramRequestHandler

同樣是生成rfile和wfile,但UDP不直接關聯socket。這里的rfile是直接由從UDP中讀取的數據生成的,wfile則是新建了一個StringIO,用於寫數據。

 

說明:

在StreamRequestHandler和DatagramRequestHandler中request的含義不同。

StreamRequestHandler中,request是一個TCP連接。每個TCP server在accept一個客戶端請求后,都會產生一個新的TCP連接,request就是這個新連接。

DatagramRequestHandler中,request是(data, self.socket),前者是從socket中接收到的數據,后者是socket本身。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM