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本身。