Python 网络编程 TCP 客户端与服务端搭建指南

陆遥
陆遥
发布时间:2026-10-11| 3人浏览过
原创

Python 的 socket 模块提供底层网络通信接口。基于 TCP 协议搭建稳定的客户端与服务端,需依次完成套接字创建、地址与端口绑定、监听分发、数据收发及连接释放。本文通过完整代码演示如何利用 threading 实现服务端并发处理,明确各核心参数的作用范围,并附带运行验证结果与常见断连排错方法。

TCP 网络通信核心组件

Socket(套接字)是网络通信的标准端点,负责在操作系统级别建立数据通道。IP 地址用于定位网络中的主机设备,端口号则标识该主机上运行的具体服务进程。TCP 协议基于三次握手建立连接,保障数据传输的顺序性与可靠性,非常适合文件传输、指令下发等场景;相比之下,UDP 则为无连接的报文传递,侧重低延迟但不做重传保障。

完整开发与调试流程

第1步:配置 TCP 服务端逻辑

目的:创建后台监听进程,支持多客户端排队接入并异步处理请求。
入口与参数:调用 socket.socket() 指定 socket.AF_INET(IPv4)与 socket.SOCK_STREAM(TCP流式);使用 bind() 绑定监听地址 0.0.0.0 与目标端口 65423;listen(5) 定义最大背对列队长度。
关键动作:进入 while True 循环持续调用 accept() 获取新连接,随后启动独立线程执行 handle_client 避免阻塞主循环。原草稿中服务端缩进层级错位会导致语法解析失败,此处已修正结构并加入 try-except 防崩溃处理。

import socket
import threading

IP = "0.0.0.0"
PORT = 65423

def handle_client(client_socket):
    try:
        # 确保连接异常退出时自动清理资源
        with client_socket as sock:
            request = sock.recv(1024)
            print(f"[*] Received: {request.decode('utf-8')}")
            sock.send(b"ACK")
    except Exception as e:
        print(f"[!] Client error: {e}")

def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((IP, PORT))
    server.listen(5)
    print(f" [*] Listening on {IP}:{PORT}")

    while True:
        client, address = server.accept()
        print(f"[*] Accepted connection from {address[0]}:{address[1]}")
        client_handler = threading.Thread(target=handle_client, args=(client,))
        client_handler.start()

if __name__ == "__main__":
    main()

完成状态判定:终端静默输出 [ *] Listening on 0.0.0.0:65423,表示服务端已就绪并可接收连接。

第2步:编写 TCP 客户端脚本

目的:模拟外部业务系统主动发起连接,发送测试载荷并校验回传内容。
入口与参数:同样初始化 IPv4 与 SOCK_STREAM 类型的套接字对象;通过 connect() 指向服务端回环地址 127.0.0.1 与同端口 65423。
关键动作:使用 sendall() 保证字符串完整编码为字节流后发出;配置 recv(4096) 设定单次读取缓冲区上限;最后调用 close() 释放文件描述符。

import socket

target_host = "127.0.0.1"
target_port = 65423

# 创建客户端套接字
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_host, target_port))

# 发送测试数据并接收响应
message = "hello, socket"
client.sendall(message.encode())
response = client.recv(4096)

print(response.decode())
client.close()

完成状态判定:控制台正常打印 ACK 字符,无 ConnectionRefusedError 或截断乱码。

第3步:环境启动与联调验证

按先后顺序执行以下命令即可触发一次完整通信闭环:

  1. 打开终端运行服务端:python server.py
  2. 另开窗口运行客户端:python client.py
服务端终端将实时刷新如下日志,证明链路打通:

[ *] Listening on 0.0.0.0:65423
[*] Accepted connection from 127.0.0.1:63382
[*] Received: hello, socket

网络编程常见异常排查

  • ConnectionRefusedError [Errno 111]:通常因服务端尚未启动、端口被其他进程抢占,或系统防火墙拦截 inbound 流量。可使用 netstat -ano | findstr :65423(Windows)或 lsof -i :65423(Linux/macOS)检查端口占用情况。
  • UnicodeDecodeError:发送方使用了非 UTF-8 编码(如 GBK),而服务端强制调用 .decode('utf-8')。需在服务端 recv() 后统一编码规则或追加 errors='ignore'。
  • 阻塞等待无响应:客户端调用 recv() 后会挂起直到收到数据或对方断开。若服务端忘记 send() 或未主动关闭连接,客户端将永久阻塞。生产环境建议配合 settimeout(30) 设置安全阈值。

总结

利用 Python 标准库实现 TCP 长连接并不复杂,核心在于理清握手时序与缓冲区管理。掌握上述模板后,可直接扩展心跳保活、粘包处理或 TLS 加密层,满足更复杂的分布式通信需求。以上就是 Python 网络编程 TCP 客户端与服务端搭建的详细内容,更多关于 Python 网络编程、Socket 模块实战的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。