python——網絡編程
阿新 • • 發佈:2017-06-03
http 對象 .cn 自動 while self. 剖析 ever self 利用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
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 ThreadingTCPServerRequestHandler相關源碼
SocketServer.BaseRequestHandler實例:
服務端 客戶端源碼精簡:
View Code如精簡代碼可以看出,SocketServer的ThreadingTCPServer之所以可以同時處理請求得益於select 和 Threading 兩個東西,其實本質上就是在服務器端為每一個客戶端創建一個線程,當前線程用來處理對應客戶端的請求,所以,可以支持同時n個客戶端鏈接(長連接)。
python——網絡編程