閱讀指引 🍀
在上面的整理篇章中 , 簡單的網絡編程基本已經會了 , 一個TCP , 一個UDP , 然后就是粘包問題
但是在上述中有一個問題 , 在現實生活中 , 一個服務端肯定常常需要同時服務好幾個客戶端 , 而上述篇章中並沒有實現一對多同時進行的情況 , TCP中只能等前一個鏈接斷開后續的才能連上 , 沒連上就一直等 ; UDP則是接一次發一次 , 並不能同時接兩次發兩次 . 為了處理這個問題 , 即實現並發 (后續文章詳細講解) , Python中有一個socketserver模塊可以滿足我們的要求
socketserver 🍀
Python提供了兩個級別訪問的網絡服務:
- 低級別的網絡服務支持基本的socket , 它提供了標准的BSD Socket API , 可以訪問底層操作系統Socket接口的全部方法
- 高級別的網絡服務模塊socketserver , 它提供了服務器中心類 , 可以簡化網絡服務器的開發
socket就不用說了 , now socketserver
我們知道基於TCP的套接字 , 關鍵就是兩個循環 , 一個鏈接循環(多人) , 一個通信循環(多消息)
在socketserver模塊中分為兩大類 : server類 (解決鏈接問題) 和request類 (解決通信問題)
如果想進一步了解 , 可以看看官方文檔 , < socketserver官方文檔 >
實現多並發 🍀
multi_socketserver_server.py
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()
到這里 , 我們成功實現了多並發 , 多並發是什么? 這就關系到操作系統中的進程和線程了 , 網絡編程既然是實現兩個進程間的通信 , 那么就逃不過進程 , 線程等了