Python网络编程核心是掌握TCP(可靠连接,如文件上传)与UDP(轻量无连接,如视频流)的区别及应用;文中给出了TCP回声服务和UDP时间查询的完整可运行代码,并附调试技巧与进阶方向。

Python 网络编程不难上手,关键在理解 TCP 和 UDP 的本质区别,并用对场景。TCP 适合需要可靠传输的通信(比如文件上传、登录验证),UDP 更轻量,适合实时性要求高、能容忍少量丢包的场景(比如视频流、游戏状态同步)。下面直接从实战出发,带你写出可运行的客户端和服务器代码。
一、TCP 通信:带连接的可靠传输
TCP 是面向连接的协议,通信前必须三次握手建立连接,传输中保证顺序和不丢失。写一个最简但完整的回声服务器(收到什么就发回什么)和客户端:
服务器端(server_tcp.py):
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('127.0.0.1', 8080)) server.listen(1) print("TCP 服务器启动,等待连接...")
conn, addr = server.accept() print(f"已连接客户端:{addr}")
while True: data = conn.recv(1024) if not data: break print(f"收到:{data.decode()}") conn.send(data) # 原样回传
conn.close() server.close()
客户端(client_tcp.py):
立即学习“Python免费学习笔记(深入)”;
import socketclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 8080))
msg = "Hello, TCP Server!" client.send(msg.encode()) response = client.recv(1024) print(f"服务器回复:{response.decode()}")
client.close()
运行顺序:先启动 server_tcp.py,再运行 client_tcp.py。注意两点:
- recv() 默认阻塞,没数据会一直等;send() 不保证一次发完,大消息需循环发送
- 实际项目中建议加 try/except 处理连接中断、超时等异常
- 多客户端支持?把 accept() 后的处理逻辑放进新线程或用 asyncio 异步化
二、UDP 通信:无连接的快速广播
UDP 不建连接、不重传、不排序,开销小,适合一对多、低延迟场景。下面实现一个单次请求-响应的“时间查询”服务:
服务器端(server_udp.py):
import socket import timeserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8081)) print("UDP 服务器启动,监听 8081...")
while True: data, addr = server.recvfrom(1024) if data == b"time": now = time.strftime("%Y-%m-%d %H:%M:%S") server.sendto(now.encode(), addr)
客户端(client_udp.py):
import socketclient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"time", ('127.0.0.1', 8081)) response, _ = client.recvfrom(1024) print("当前时间:", response.decode())
client.close()
关键点:
- UDP 用 recvfrom() 和 sendto(),自动携带地址信息,无需提前 connect
- 没有“连接断开”概念,所以不用 close() 也能工作,但养成关闭习惯更稳妥
- UDP 可能丢包、乱序——如果你发的是“心跳包”或“位置快照”,丢了下一帧补上就行,不必重发
三、常见问题与调试技巧
写完跑不通?先查这几个地方:
- 端口被占用?用 netstat -an | grep 8080(Linux/macOS)或 netstat -ano | findstr :8080(Windows)查进程,或换其他端口(如 8082)
- 防火墙拦截?临时关闭测试,或添加入站规则允许对应端口
- localhost vs 127.0.0.1?多数情况等价,但某些系统配置下有差异,统一用 127.0.0.1 更稳
- 中文乱码?确保 encode() 和 decode() 编码一致,默认用 'utf-8'
四、进阶方向建议
掌握基础后,可按需延伸:
- 加 TLS 加密:用 ssl.wrap_socket() 包装 socket,实现 HTTPS 或安全聊天
- 支持多用户:TCP 用 threading 或 asyncio;UDP 可结合 select/poll 实现单线程多路复用
- 封装成类:把 socket、bind、send/recv 封装成 Server/Client 类,提升复用性和可读性
- 对接真实协议:比如用 socket 模拟 HTTP GET 请求,或解析 DNS 查询报文(UDP + 二进制结构)











