標籤:client 處理 self 執行個體 handler ges 伺服器端 相關 精簡
利用select監聽終端操作執行個體 利用select實現偽同時處理多個Socket用戶端請求:服務端 利用select實現偽同時處理多個Socket用戶端請求:用戶端
此處的Socket服務端相比與原生的Socket,他支援當某一個請求不再發送資料時,伺服器端不會等待而是可以去處理其他請求的資料。但是,如果每個請求的耗時比較長時,select版本的伺服器端也無法完成同時操作。
基於select實現socket服務端(python2) python3實現
SocketServer模組
SocketServer內部使用 IO多工 以及 “多線程” 和 “多進程” ,從而實現並發處理多個用戶端請求的Socket服務端。即:每個用戶端請求串連到伺服器時,Socket服務端都會在伺服器是建立一個“線程”或者“進程” 專門負責處理當前用戶端的所有請求。
ThreadingTCPServer
ThreadingTCPServer實現的Soket伺服器內部會為每個client建立一個 “線程”,該線程用來和用戶端進行互動。
1、ThreadingTCPServer基礎
使用ThreadingTCPServer:
- 建立一個繼承自 SocketServer.BaseRequestHandler 的類
- 類中必須定義一個名稱為 handle 的方法
- 啟動ThreadingTCPServer
SocketServer實現伺服器 用戶端
2、ThreadingTCPServer源碼剖析
ThreadingTCPServer的類圖關係如下:
內部調用流程為:
- 啟動服務端程式
- 執行 TCPServer.__init__ 方法,建立服務端Socket對象並綁定 IP 和 連接埠
- 執行 BaseServer.__init__ 方法,將自訂的繼承自SocketServer.BaseRequestHandler 的類 MyRequestHandle賦值給 self.RequestHandlerClass
- 執行 BaseServer.server_forever 方法,While 迴圈一直監聽是否有用戶端請求到達 ...
- 當用戶端串連到達伺服器
- 執行 ThreadingMixIn.process_request 方法,建立一個 “線程” 用來處理請求
- 執行 ThreadingMixIn.process_request_thread 方法
- 執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自訂 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)
ThreadingTCPServer相關源碼:
BaseServer TCPServer ThreadingMixIn ThreadingTCPServer
RequestHandler相關源碼
SocketServer.BaseRequestHandler
執行個體:
服務端 用戶端
源碼精簡:
View Code
如精簡代碼可以看出,SocketServer的ThreadingTCPServer之所以可以同時處理請求得益於select 和 Threading 兩個東西,其實本質上就是在伺服器端為每一個用戶端建立一個線程,當前線程用來處理對應用戶端的請求,所以,可以支援同時n個用戶端連結(長串連)。
python——網路編程