單執行緒伺服器一次只能處理一個連線。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() 阻塞主執行緒持續監聽。
import socketserver
# 類別名相同,模組名小寫
class MyRequestHandler(socketserver.BaseRequestHandler):
...
server = socketserver.ThreadingTCPServer(ADDR, MyRequestHandler)
ThreadPool 或 asyncio。try/except 與日誌。ThreadingTCPServer 是快速建立並發 TCP 服務的標準庫捷徑。