標籤:名稱 mixin 定義 連接埠 code request pre form connect
利用socket模組建立socket通訊服務,但發現利用socket模組建立的服務無法進行多線程的處理,當需要進行大量請求處理時,請求就會阻塞在隊列中,甚至發生請求丟棄。並且如果我們需要大量的socket時,就需要重複建立許多socket、綁定連接埠..... ,對於程式員來說意味著重複書寫大量無意義代碼。
那有沒有一種方式既能簡化書寫流程又能實現多線程開發呢 ? 答案是肯定的,這就是SocketServer模組。
SocketServer簡化了網路伺服器的編寫。在進行socket建立時,使用SocketServer會大大減少建立的步驟,並且SocketServer使用了select它有4個類:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。這4個類是同步進行處理的,另外通過ForkingMixIn和ThreadingMixIn類來支援非同步。
該模組在python3中已經更名為socketserver。
使用ThreadingTCPServer:
- 建立一個繼承自 SocketServer.BaseRequestHandler 的類
- 類中必須定義一個名稱為 handle 的方法
- 啟動ThreadingTCPServer
服務端:
import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while True: self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) if not self.data: print("斷開了") break self.request.sendall(self.data.upper())if __name__ == "__main__": HOST, PORT = "localhost", 9999 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) server.serve_forever()
用戶端和socket的一樣:
import socketip_port = (‘127.0.0.1‘,9999)client = socket.socket()client.connect(ip_port)while True: data = input("用戶端輸入:").strip() if len(data) == 0: continue client.sendall(data.encode("utf-8")) server_reply = client.recv(1024) print("用戶端收到:",server_reply.decode())
Python學習筆記15(socketservre)