socketserver模塊
阿新 • • 發佈:2017-11-06
conn pro raw while 源碼剖析 bytes utf8 main 客戶端
socketserver
socketserver內部使用IO多路復用以及“多線程”和“多進程”,從而實現並發處理多個客戶端請求的scoket服務端。即,每個客戶端請求連接到服務器時,socket服務端都會在服務器是創建一個“線程”或“進程”專門負責處理當前客戶端的所有請求。
ThradingTCPServer
ThradingTCPServer實現的socket服務器內部會為每個client創建一個“線程”,該線程用來heels客戶端進行交互
1,ThradingTCPServer 基礎
使用ThradingTCPServer:
- 創建一個繼承 socketserver.BaseRequestHandler 的類
- 類中必須定義一個名we誒handle 的方法
- 啟動 ThradingTCPServer
代碼:
#!/usr/bin/env python3 import socketserver class Server(socketserver.BaseRequestHandler): #$ 必須繼承BaseRequestHandler def handle(self): #$ 必須有handle方法 print(‘New connection:‘,self.client_address) while True: data = self.request.recv(1024) if not data:break print(‘Client data:‘,data.decode()) self.request.send(data) if __name__ == ‘__main__‘: server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,8009),MyServer) #$ 實現多線程的socket server.serve_forever() #$ 當前連接斷開不會出現關閉或報錯,可以與其他客戶端繼續連接
client端:
import socket ip_port = (‘127.0.0.1‘,8080) sk = socket.socket() sk.connect(ip_port) while True: raw = input(‘>> ‘).strip() sk.send(bytes(raw,‘utf8‘)) msg = sk.recv(1024) print(str(msg,‘utf8‘)) sk.close()
2,ThradingTCPServer源碼剖析
內部調用流程為:
- 啟動服務端程序
- 執行 TCPServer.__init__方法,創建服務端socket對象並綁定IP和端口
- 執行 BaseServeer.__init__方法,將自定義的繼承自socketserver.BaseRequestHandler 的類 MyRequestHandle賦值給 self.RequestHandlerClass
- 執行BaseServer.server_forever 方法,while 循環一直監聽是否有客戶端請求到達
- 當客戶端連接到達服務器
- 執行ThreadingMixIn.proceess_request 方法,創建一個“線程”用來處理請求
- 執行 ThreadingMixIn.proceess_request _thread 方法
- 執行 BaseServer.finish_request 方法,執行 self.RequseetHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類 BaseRequestHandler的構造方法,在該構造方法中又會調用MyRequestHandler的handle方法)
socketserver模塊