Python之路 - Socketserver實現多並發


閱讀指引 🍀

在上面的整理篇章中 , 簡單的網絡編程基本已經會了 , 一個TCP , 一個UDP , 然后就是粘包問題

但是在上述中有一個問題 , 在現實生活中 , 一個服務端肯定常常需要同時服務好幾個客戶端 , 而上述篇章中並沒有實現一對多同時進行的情況 , TCP中只能等前一個鏈接斷開后續的才能連上 , 沒連上就一直等 ; UDP則是接一次發一次 , 並不能同時接兩次發兩次 . 為了處理這個問題 , 即實現並發 (后續文章詳細講解) , Python中有一個socketserver模塊可以滿足我們的要求

socketserver 🍀

Python提供了兩個級別訪問的網絡服務:

  1. 低級別的網絡服務支持基本的socket , 它提供了標准的BSD Socket API , 可以訪問底層操作系統Socket接口的全部方法
  2. 高級別的網絡服務模塊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() 

到這里 , 我們成功實現了多並發 , 多並發是什么? 這就關系到操作系統中的進程和線程了 , 網絡編程既然是實現兩個進程間的通信 , 那么就逃不過進程 , 線程等了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM