Python 网络编程 TCP 客户端与服务端搭建指南
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步:环境启动与联调验证
按先后顺序执行以下命令即可触发一次完整通信闭环:
- 打开终端运行服务端:
python server.py - 另开窗口运行客户端:
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 模块实战的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









