Python socketserver模块
socketserver 简化服务器开发,内置多进程/多线程支持。
基本TCP服务器
Python
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
# self.request 是客户端 socket
data = self.request.recv(1024)
print(f"收到: {data.decode()}")
self.request.sendall(data) # 回显
# 启动服务器
with socketserver.TCPServer(('localhost', 8080), MyTCPHandler) as server:
print("服务器启动...")
server.serve_forever()
基本UDP服务器
Python
import socketserver
class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
# UDP: self.request 是 (data, socket)
data = self.request[0]
socket = self.request[1]
print(f"收到: {data.decode()}")
socket.sendto(data, self.client_address)
with socketserver.UDPServer(('localhost', 8081), MyUDPHandler) as server:
print("UDP 服务器启动...")
server.serve_forever()
多线程服务器
Python
import socketserver
import threading
class ThreadedTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
response = f"处理线程: {threading.current_thread().name}"
self.request.sendall(response.encode())
# ThreadingTCPServer 自动创建线程处理
with socketserver.ThreadingTCPServer(('localhost', 8080), ThreadedTCPHandler) as server:
print("多线程 TCP 服务器启动...")
server.serve_forever()
多进程服务器
Python
import socketserver
class ForkingTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
self.request.sendall(data)
# ForkingTCPServer 创建子进程处理(Unix only)
# ForkingMixIn + TCPServer 组合
class MyForkingServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass
with MyForkingServer(('localhost', 8080), ForkingTCPHandler) as server:
server.serve_forever()
自定义服务器类
Python
import socketserver
# 组合 MixIn 创建自定义服务器
class ThreadedUDPServer(socketserver.ThreadingMixIn, socketserver.UDPServer):
pass
class ForkingTCPServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass
# 配置服务器
class ConfigurableServer(socketserver.TCPServer):
allow_reuse_address = True # 允许端口重用
timeout = 5 # 设置超时
StreamRequestHandler
Python
import socketserver
class StreamHandler(socketserver.StreamRequestHandler):
def handle(self):
# self.rfile 读取流,self.wfile 写入流
data = self.rfile.readline().strip()
print(f"收到: {data.decode()}")
self.wfile.write(data + b'\n')
with socketserver.TCPServer(('localhost', 8080), StreamHandler) as server:
server.serve_forever()
DatagramRequestHandler
Python
import socketserver
class DatagramHandler(socketserver.DatagramRequestHandler):
def handle(self):
# UDP 数据报处理
data = self.rfile.read()
print(f"收到: {data.decode()}")
self.wfile.write(data)
with socketserver.UDPServer(('localhost', 8081), DatagramHandler) as server:
server.serve_forever()
客户端地址访问
Python
import socketserver
class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
# self.client_address 是客户端地址元组
ip, port = self.client_address
print(f"客户端: {ip}:{port}")
# self.server 是服务器实例
print(f"服务器: {self.server.server_address}")
服务器关闭
Python
import socketserver
import threading
def run_server():
with socketserver.TCPServer(('localhost', 8080), MyHandler) as server:
server.serve_forever()
# 启动服务器线程
thread = threading.Thread(target=run_server)
thread.start()
# 关闭服务器
# server.shutdown() # 停止 serve_forever
# server.server_close() # 关闭 socket
服务器类型对比
| 类型 | 说明 | 适用场景 |
|---|---|---|
| TCPServer | 单线程 TCP | 简单服务 |
| UDPServer | 单线程 UDP | 简单 UDP |
| ThreadingTCPServer | 多线程 TCP | 多客户端 |
| ThreadingUDPServer | 多线程 UDP | 高并发 UDP |
| ForkingTCPServer | 多进程 TCP | CPU密集(Unix) |
Handler 类型对比
| 类型 | 说明 |
|---|---|
| BaseRequestHandler | 基类,手动处理 |
| StreamRequestHandler | TCP 流式读写 |
| DatagramRequestHandler | UDP 数据报 |
完整示例
Python
import socketserver
class EchoHandler(socketserver.StreamRequestHandler):
def handle(self):
print(f"连接来自: {self.client_address}")
try:
while True:
data = self.rfile.readline()
if not data:
break
self.wfile.write(data)
except Exception as e:
print(f"错误: {e}")
if __name__ == '__main__':
HOST, PORT = 'localhost', 8080
with socketserver.ThreadingTCPServer((HOST, PORT), EchoHandler) as server:
server.allow_reuse_address = True
print(f"服务器启动: {HOST}:{PORT}")
server.serve_forever()
要点总结
TCPServer和UDPServer是基本服务器类ThreadingMixIn和ForkingMixIn添加并发处理BaseRequestHandler.handle()处理请求StreamRequestHandler使用 rfile/wfile 流式读写DatagramRequestHandler处理 UDP 数据报serve_forever()持续服务,shutdown()停止allow_reuse_address = True允许端口重用- socketserver 简化服务器开发,避免底层 socket 操作
📝 发现内容有误?点击此处直接编辑