1. 创建TCP服务器与客户端

任务目标

使用Python标准库socket实现一个TCP服务器与客户端:客户端向服务器发送一条字符串消息,服务器接收后原样返回(回声),客户端打印服务器返回的内容。通过本案例掌握TCP套接字创建、绑定、监听、连接、收发数据的基本流程。

环境依赖

  • Python 3.6+(无需安装第三方库)
  • 本机回环地址127.0.0.1,端口使用12345(若被占用可自行更换)

完整代码

将以下代码保存为tcp_echo.py,服务器与客户端通过sys.argv参数区分启动模式:

```python import socket import sys import threading SERVER_HOST = '127.0.0.1' SERVER_PORT = 12345 def run_server(): # 创建TCP套接字(AF_INET: IPv4, SOCK_STREAM: TCP) server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 允许端口立即重用,避免TIME_WAIT状态导致重启失败 server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_sock.bind((SERVER_HOST, SERVER_PORT)) server_sock.listen(1) print(f'[服务器] 监听于 {SERVER_HOST}:{SERVER_PORT}') conn, addr = server_sock.accept() print(f'[服务器] 客户端已连接: {addr}') # 接收客户端消息(最大1024字节) data = conn.recv(1024) if data: message = data.decode('utf-8') print(f'[服务器] 收到: {message}') # 原样返回 conn.sendall(data) conn.close() server_sock.close() print('[服务器] 连接已关闭') def run_client(): # 创建TCP套接字 client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_sock.connect((SERVER_HOST, SERVER_PORT)) print(f'[客户端] 已连接服务器 {SERVER_HOST}:{SERVER_PORT}') message = 'Hello, TCP Server!' client_sock.sendall(message.encode('utf-8')) print(f'[客户端] 已发送: {message}') # 接收服务器回声 reply = client_sock.recv(1024).decode('utf-8') print(f'[客户端] 收到回声: {reply}') client_sock.close() print('[客户端] 连接已关闭') if __name__ == '__main__': if len(sys.argv) != 2 or sys.argv[1] not in ('server', 'client'): print('用法: python tcp_echo.py [server|client]') sys.exit(1) if sys.argv[1] == 'server': run_server() else: run_client() ```

运行与验证

本案例需要两个终端窗口配合运行:

  1. 终端1启动服务器:python tcp_echo.py server,看到监听日志后保持运行。
  2. 终端2启动客户端:python tcp_echo.py client。

通过条件:客户端终端打印出收到回声: Hello, TCP Server!,且服务器终端打印出收到: Hello, TCP Server!,即表示TCP通信链路完整打通。

常见问题

  • 端口被占用:若启动服务器时报Address already in use,更换代码中的SERVER_PORT为其他值(如12346),两端保持一致即可。
  • 先启动客户端:客户端必须先等待服务器进入监听状态,否则会报Connection refused。请严格按先服务器后客户端的顺序启动。
  • 中文消息:本案例使用UTF-8编码,发送中文时需确保两端终端编码一致,否则可能出现乱码。