首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 實作多執行緒 TCP 伺服器:SocketServer.ThreadingTCPServer

     編輯:更多程式設計知識

單執行緒伺服器一次只能處理一個連線。SocketServer.ThreadingTCPServer (Python 3 為 socketserver.ThreadingTCPServer) 自動為每個連線建立執行緒,實現並發處理。本文提供完整伺服器/客戶端範例 (Windows 環境)。

伺服器端


import SocketServer
from time import ctime

HOST = ''
PORT = 21567
ADDR = (HOST, PORT)

class MyRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print('...connected from:', self.client_address)
        while True:
            data = self.request.recv(1024)
            if not data:
                break
            self.request.sendall('[%s] %s' % (ctime(), data))

tcpServ = SocketServer.ThreadingTCPServer(ADDR, MyRequestHandler)
print('waiting for connection...')
tcpServ.serve_forever()

客戶端


from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

while True:
    tcpCliSock = socket(AF_INET, SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    data = raw_input('> ')
    if not data:
        break
    tcpCliSock.send('%s\r\n' % data)
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print(data.strip())
    # tcpCliSock.close()  # 註解掉保持連線測試

關鍵點

  • BaseRequestHandler.handle() 為每個連線自動在新執行緒呼叫。
  • self.request 為連線 socket 物件。
  • serve_forever() 阻塞主執行緒持續監聽。
  • 客戶端迴圈每次輸入建立新連線,模擬短連線場景。

Python 3 遷移


import socketserver
# 類別名相同,模組名小寫
class MyRequestHandler(socketserver.BaseRequestHandler):
    ...
server = socketserver.ThreadingTCPServer(ADDR, MyRequestHandler)

生產環境考量

  1. 執行緒數無上限,高併發可能耗盡資源,建議使用 ThreadPool 或 asyncio。
  2. 缺乏優雅關閉機制 (訊號處理)。
  3. 無 TLS 加密,傳輸明文。
  4. 錯誤處理簡略,需加入 try/except 與日誌。

ThreadingTCPServer 是快速建立並發 TCP 服務的標準庫捷徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved