Python socket 模块实战:搭建 TCP 服务器并处理多客户端请求
·
TCP 服务器基础搭建
使用 socket 模块创建 TCP 服务器需要以下核心步骤:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8888))
server_socket.listen(5)
print("Server listening on port 8888")
AF_INET 指定 IPv4 地址族,SOCK_STREAM 表示 TCP 协议。bind() 绑定端口后,listen(5) 设置待处理连接队列的最大长度。
单线程处理客户端连接
基础循环接受连接的方式只能串行处理请求:
while True:
client_socket, addr = server_socket.accept()
print(f"Connection from {addr}")
data = client_socket.recv(1024)
client_socket.send(b"ECHO: " + data)
client_socket.close()
这种方式会阻塞后续连接直到当前连接处理完成,不适合实际生产环境。
多线程处理并发连接
通过线程池可支持并行处理:
from threading import Thread
def handle_client(client_socket):
try:
while True:
data = client_socket.recv(1024)
if not data: break
client_socket.send(b"ACK: " + data)
finally:
client_socket.close()
while True:
client_socket, addr = server_socket.accept()
Thread(target=handle_client, args=(client_socket,)).start()
每个新连接都会创建独立线程,注意线程数过多时的资源消耗问题。
使用 SocketServer 模块简化
Python 标准库提供更高级的封装:
from socketserver import ThreadingTCPServer, BaseRequestHandler
class EchoHandler(BaseRequestHandler):
def handle(self):
while True:
data = self.request.recv(1024)
if not data: break
self.request.sendall(data)
server = ThreadingTCPServer(('0.0.0.0', 8888), EchoHandler)
server.serve_forever()
ThreadingTCPServer 自动实现多线程支持,开发者只需关注业务逻辑。
异常处理与资源清理
可靠的服务器需要完善的错误处理:
try:
while True:
try:
client_socket, addr = server_socket.accept()
Thread(target=handle_client, args=(client_socket,)).start()
except OSError as e:
print(f"Connection error: {e}")
finally:
server_socket.close()
确保在程序退出时释放端口资源,处理客户端连接中的网络异常。
性能优化建议
设置 socket 参数提升性能:
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.settimeout(1.0) # 设置accept超时
SO_REUSEADDR 允许快速重启服务器,超时设置避免无限阻塞。对于高并发场景建议使用异步 IO 框架如 asyncio。
更多推荐


所有评论(0)