1. 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基础流程的最小可运行实现,生产环境的高并发处理不在本案例范围内。