python網路編程:socketserver的基本使用,pythonsocketserver
本文內容:
- 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)
- 運行服務端
-
- 持續迴圈運行:serve_forever(),即使一個串連報錯了,但不會導致程式停止,而是會持續運行,與其他用戶端通訊
- 停止server_forever:shutdown()
服務端:
import socketserverclass 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 socketclient=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 socketserverclass 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",9999server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)#多線程版server.serve_forever()