本文內容:
- socketserver的介紹
- socketserver的使用
- socketserver的異步服務端
首發時間:2018-03-21
也可以使用socketserver來創建socket
socketserver的介紹:
- socketserver是標准庫中的一個高級模塊
- socketserver可以簡化創建客戶端跟創建服務端的代碼
socketserver的使用:
- 首先導入模塊:import socketserver
- 初始化控制器類Handler【Handler是一個繼承BaseRequestHandler的類Handler中的handle方法決定了每一個連接過來的操作】 【控制器類的類名可以是其他的,不一定是Handler,只要繼承了BaseRequestHandler就行】
-
- init():初始化控制設置,初始化連接套接字,地址,處理實例等信息
- handle(): 定義了如何處理每一個連接。
- setup(): 在handle()之前執行.一般用作設置默認之外的連接配置
- finish():在handle()之后執行。
- 變量:
-
- self.request屬性是套接字對象,所以使用self.request.xxxx調用套接字的函數
- self.server包含調用處理程序的實例
- self.client_address是客戶端地址信息
- 定義服務端類型【將Handler類和服務端的地址端口參數傳入】:
-
- TCPServer 支持ipv4的TCP協議的服務器。
- server=socketserver.TCPServer((HOST,PORT),Handler)【Handler】
- UDPServer 支持ipv4的UDP協議的服務器。
- server=socketserver.UDPServer((HOST,PORT),Handler)
- 運行服務端
服務端:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): try: while True: self.data=self.request.recv(1024) print("{} send:".format(self.client_address),self.data) if not self.data: print("connection lost") break self.request.sendall(self.data.upper()) except Exception as e: print(self.client_address,"連接斷開") finally: self.request.close() def setup(self): print("before handle,連接建立:",self.client_address) def finish(self): print("finish run after handle") if __name__=="__main__": HOST,PORT = "localhost",9999 server=socketserver.TCPServer((HOST,PORT),MyTCPHandler) server.serve_forever()
客戶端:
import socket client=socket.socket() client.connect(('localhost',9999)) while True: cmd=input("(quit退出)>>").strip() if len(cmd)==0: continue if cmd=="quit": break client.send(cmd.encode()) cmd_res=client.recv(1024) print(cmd_res.decode()) client.close()
socketserver的異步服務端:
多線程:ThreadingTCPServer
多進程:ForkingTCPServer(Unix)
多線程版:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): try: while True: self.data=self.request.recv(1024) print("{} send:".format(self.client_address),self.data) if not self.data: print("connection lost") break self.request.sendall(self.data.upper()) except Exception as e: print(self.client_address,"連接斷開") finally: self.request.close() def setup(self): print("before handle,連接建立:",self.client_address) def finish(self): print("finish run after handle") HOST,PORT = "localhost",9999 server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)#多線程版 server.serve_forever()