全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-19 8 分钟 ✍️ juanwangdev

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多进程 TCPCPU密集(Unix)

Handler 类型对比

类型说明
BaseRequestHandler基类,手动处理
StreamRequestHandlerTCP 流式读写
DatagramRequestHandlerUDP 数据报

完整示例

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()

要点总结

  • TCPServerUDPServer 是基本服务器类
  • ThreadingMixInForkingMixIn 添加并发处理
  • BaseRequestHandler.handle() 处理请求
  • StreamRequestHandler 使用 rfile/wfile 流式读写
  • DatagramRequestHandler 处理 UDP 数据报
  • serve_forever() 持续服务,shutdown() 停止
  • allow_reuse_address = True 允许端口重用
  • socketserver 简化服务器开发,避免底层 socket 操作

📝 发现内容有误?点击此处直接编辑

← 上一篇 Python Web框架概述
下一篇 → Python socket基础
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库