1. 程式人生 > >python——網絡編程

python——網絡編程

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
技術分享 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之所以可以同時處理請求得益於selectThreading 兩個東西,其實本質上就是在服務器端為每一個客戶端創建一個線程,當前線程用來處理對應客戶端的請求,所以,可以支持同時n個客戶端鏈接(長連接)。

python——網絡編程