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启动服务器:
python tcp_echo.py server,看到监听日志后保持运行。
- 终端2启动客户端:
python tcp_echo.py client。
通过条件:客户端终端打印出收到回声: Hello, TCP Server!,且服务器终端打印出收到: Hello, TCP Server!,即表示TCP通信链路完整打通。
常见问题
- 端口被占用:若启动服务器时报
Address already in use,更换代码中的SERVER_PORT为其他值(如12346),两端保持一致即可。
- 先启动客户端:客户端必须先等待服务器进入监听状态,否则会报
Connection refused。请严格按先服务器后客户端的顺序启动。
- 中文消息:本案例使用UTF-8编码,发送中文时需确保两端终端编码一致,否则可能出现乱码。