《用 Python 在 Linux 环境搭建 TCP 通信服务:代码示例与细节说明》
·
用 Python 在 Linux 环境搭建 TCP 通信服务:代码示例与细节说明
1. TCP 通信核心原理
TCP 协议通过三次握手建立可靠连接,数据传输保证顺序性和完整性。核心流程:
- 服务端:创建套接字 → 绑定地址 → 监听连接 → 接受请求 → 数据交换
- 客户端:创建套接字 → 发起连接 → 数据交换
数学描述通信可靠性: $$ P(\text{成功传输}) = 1 - \prod_{i=1}^{n} (1 - p_i) $$ 其中 $p_i$ 表示第 $i$ 个数据包的传输成功率。
2. 服务端实现代码
import socket
# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定本地地址 (0.0.0.0 表示所有可用接口)
server_socket.bind(('0.0.0.0', 8888))
# 开始监听 (5为等待队列长度)
server_socket.listen(5)
print("服务端已启动,等待客户端连接...")
while True:
# 接受客户端连接
client_socket, addr = server_socket.accept()
print(f"客户端 {addr} 已连接")
try:
# 接收数据 (1024为缓冲区大小)
data = client_socket.recv(1024)
print(f"收到消息: {data.decode('utf-8')}")
# 发送响应
response = "消息已接收"
client_socket.send(response.encode('utf-8'))
finally:
# 关闭当前客户端连接
client_socket.close()
关键参数说明:
socket.AF_INET:IPv4 地址族socket.SOCK_STREAM:TCP 协议类型bind(('0.0.0.0', 8888)):绑定所有网卡的 8888 端口recv(1024):接收缓冲区大小(字节)
3. 客户端实现代码
import socket
# 创建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# 连接服务器 (替换为实际服务器IP)
client_socket.connect(('127.0.0.1', 8888))
# 发送数据
message = "Hello TCP Server!"
client_socket.send(message.encode('utf-8'))
# 接收响应
response = client_socket.recv(1024)
print(f"服务器响应: {response.decode('utf-8')}")
finally:
# 关闭连接
client_socket.close()
连接过程说明:
connect()触发 TCP 三次握手send()自动处理数据分包recv()阻塞直到数据到达
4. 运行测试步骤
- 在 Linux 终端启动服务端:
python3 server.py - 另开终端启动客户端:
python3 client.py - 观察输出:
- 服务端显示:
客户端 ('192.168.1.10', 54236) 已连接 - 客户端显示:
服务器响应: 消息已接收
- 服务端显示:
5. 关键注意事项
-
端口选择:
- 使用 1024-65535 端口(0-1023 需 root 权限)
- 避免
Address already in use错误:设置socket.SO_REUSEADDR
-
数据编码:
- 必须统一编码(推荐 UTF-8)
- 错误示例:
send(b'raw_bytes')与decode()不匹配
-
连接管理:
- 使用
try/finally确保关闭套接字 - 服务端需处理多客户端:使用线程或
select模块
- 使用
-
性能优化:
# 设置缓冲区大小 client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 8192) # 启用TCP_NODELAY减少延迟 client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
6. 完整通信流程
graph LR
A[客户端] -->|SYN| B[服务端]
B -->|SYN-ACK| A
A -->|ACK| B
B -->|建立连接| C[数据传输]
C --> D[FIN断开]
通过此实现方案,可在 Linux 系统快速构建基于 TCP 的双向通信系统,适用于物联网设备控制、分布式系统协调等场景。
更多推荐
所有评论(0)