Python3中的SocketServer
socket並不能多並發,只能支持一個用戶,socketserver 簡化了編寫網絡服務程序的任務,socketserver是socket的在封裝。socketserver在python2中為SocketServer,在python3種取消了首字母大寫,改名為socketserver。socketserver中包含了兩種類,一種為服務類(server class),一種為請求處理類(request handle class)。前者提供了許多方法:像綁定,監聽,運行…… (也就是建立連接的過程) 后者則專注於如何處理用戶所發送的數據(也就是事務邏輯)。一般情況下,所有的服務,都是先建立連接,也就是建立一個服務類的實例,然后開始處理用戶請求,也就是建立一個請求處理類的實例。
socketserver一共有這么幾種類型:
1. class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
2. class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
3. class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
4. class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)
繼承關系圖:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
如何創建一個socketserver :
- First, you must create a request handler class by subclassing the
BaseRequestHandler
class and overriding itshandle()
method; this method will process incoming requests. - Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
- Then call the
handle_request()
orserve_forever()
method of the server object to process one or many requests. - Finally, call
server_close()
to close the socket.
1. 創建一個請求處理的類,並且這個類要繼承
BaseRequestHandler
class ,並且還要
重寫父類里handle()方法;
注釋:為什么要重寫handle方法時加上while循環
handle方法默認結束后斷開鏈接繼續監聽
2. 你必須實例化 TCPServer,並且傳遞server IP和你上面創建的請求處理類,給這個TCPServer;
3. server.handle_requese()#只處理一個請求,server.server_forever()處理多個一個請求,永遠執行
4. 關閉連接server_close()
import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): # 創建一個鏈接,繼承於socketserver中的BaseRequestHandler類 conn = self.request # 發送登錄提示 conn.sendall(b"Welcome to login...") print("Client connect...") while True: print("Waitting for recving message...") # 接收消息 message = conn.recv(1024) print(message.decode('utf-8')) # 收到exit就退出 if message == "exit": break # 回復消息 data = input("Reply message:") # 發送消息 conn.sendall(data.encode('utf-8')) if __name__ == "__main__": # 實例化 server = socketserver.ThreadingTCPServer(('127.0.0.1', 999, ), MyServer) # 調用serve_forever方法 server.serve_forever() ''' def serve_forever(self, poll_interval=0.5): """ Handle one request at a time until shutdown. Polls for shutdown every poll_interval seconds. Ignores self.timeout. If you need to do periodic tasks, do them in another thread. """ ''' multi_socketserver_client.py # 就是一個簡單的TCP客戶端 import socket sock = socket.socket() # 連接服務端 sock.connect(('127.0.0.1', 999, )) login = sock.recv(1024) print(login.decode('utf-8')) while True: message = input("Please input the message:").strip() if message == "exit": sock.sendall(b'exit') break else: sock.sendall(message.encode('utf-8')) print("Waitting for recving message...") data = sock.recv(1024) print(data.decode('utf-8')) sock.close()