用 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()

连接过程说明:

  1. connect() 触发 TCP 三次握手
  2. send() 自动处理数据分包
  3. recv() 阻塞直到数据到达

4. 运行测试步骤
  1. 在 Linux 终端启动服务端:
    python3 server.py
    

  2. 另开终端启动客户端:
    python3 client.py
    

  3. 观察输出:
    • 服务端显示:客户端 ('192.168.1.10', 54236) 已连接
    • 客户端显示:服务器响应: 消息已接收

5. 关键注意事项
  1. 端口选择

    • 使用 1024-65535 端口(0-1023 需 root 权限)
    • 避免 Address already in use 错误:设置 socket.SO_REUSEADDR
  2. 数据编码

    • 必须统一编码(推荐 UTF-8)
    • 错误示例:send(b'raw_bytes')decode() 不匹配
  3. 连接管理

    • 使用 try/finally 确保关闭套接字
    • 服务端需处理多客户端:使用线程或 select 模块
  4. 性能优化

    # 设置缓冲区大小
    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 的双向通信系统,适用于物联网设备控制、分布式系统协调等场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐