1. TCP回显服务器

TCP回显服务器 学习卡片

任务说明

实现一个基于TCP协议的回显服务器:服务器监听指定端口,接收客户端发送的消息,并将消息原样返回给客户端。通过本案例理解TCP服务器端的基本流程:创建套接字、绑定地址、监听连接、接受连接、收发数据、关闭连接。

环境依赖

  • Python 3.6+(标准库,无需第三方依赖)
  • 操作系统:Windows / Linux / macOS 均可

完整实现代码

import socket

HOST = '127.0.0.1'  # 监听本机回环地址
PORT = 8888         # 监听端口

def run_server():
    # 1. 创建TCP套接字
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 允许端口复用,便于快速重启服务
    server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    # 2. 绑定地址和端口
    server_sock.bind((HOST, PORT))
    
    # 3. 开始监听,最大等待连接数为5
    server_sock.listen(5)
    print(f"[服务器] 已启动,监听 {HOST}:{PORT}")
    
    try:
        while True:
            # 4. 接受客户端连接
            client_sock, client_addr = server_sock.accept()
            print(f"[服务器] 客户端 {client_addr} 已连接")
            
            # 5. 接收数据并原样返回(回显)
            while True:
                data = client_sock.recv(1024)
                if not data:
                    break  # 客户端关闭连接
                client_sock.sendall(data)  # 原样返回
                print(f"[服务器] 收到并回显 {len(data)} 字节")
            
            # 6. 关闭客户端连接
            client_sock.close()
            print(f"[服务器] 客户端 {client_addr} 已断开")
    except KeyboardInterrupt:
        print("\n[服务器] 手动中断,正在退出...")
    finally:
        server_sock.close()

if __name__ == '__main__':
    run_server()

运行与验证

启动服务器:

python tcp_echo_server.py

终端输出 [服务器] 已启动,监听 127.0.0.1:8888 表示监听成功。

测试客户端(另开一个终端):

python -c "import socket; s=socket.socket(); s.connect(('127.0.0.1',8888)); s.sendall(b'hello'); print('收到:', s.recv(1024)); s.close()"

通过条件:

  • 客户端终端输出 收到: b'hello',说明服务器正确回显了原始消息;
  • 服务器终端显示收到并回显 5 字节,且客户端断开日志正常打印;
  • 按 Ctrl+C 可正常终止服务器,无异常堆栈。

TCP流程要点

上述代码严格对应TCP服务器端四个核心步骤:socket() 创建套接字 → bind() 绑定地址 → listen() 进入监听状态 → accept() 接受连接。收发数据使用 recv()/sendall(),其中 sendall() 确保数据全部发送完毕。注意 recv(1024) 表示单次最多读取1024字节,实际读取量可能小于该值,因此回显时直接使用实际收到的 data 变量,而非固定长度。

本案例为单线程串行处理模式:同一时刻只能服务一个客户端,当前客户端断开后才接受下一个连接。这是理解TCP基础流程的最小可运行实现,生产环境的高并发处理不在本案例范围内。