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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐