PYTHON网络编程——UDP篇
一、UDP简介
什么是UDP?
UDP(用户数据报协议)是一种无连接的传输层协议,具有以下特点:
- 无需建立连接
- 不可靠传输(可能丢包)
- 传输速度快
- 适合实时性要求高的场景
基本流程对比
1 | TCP编程流程:创建socket → 绑定 → 监听 → 接受连接 → 收发数据 → 关闭 |
二、服务端代码详解
1 | import socket |
三、客户端代码详解
1 | import socket |
四、关键知识点
1. UDP套接字创建
1 | socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
AF_INET: IPv4地址族SOCK_DGRAM: UDP数据报类型
2. 地址绑定
1 | # 服务端必须绑定,客户端可选 |
3. 数据收发
1 | # 接收数据(返回数据和来源地址) |
4. 编码转换
1 | # 发送:字符串 → 字节 |
五、注意事项
UDP是无连接的
- 每次发送都要指定目标地址
- 不保证数据顺序和可靠性
地址和端口
- 服务端需要固定端口
- 客户端端口通常由系统分配
数据大小
- UDP数据包不宜过大(通常<1500字节)
- 避免IP分片,提高传输效率
阻塞问题
recvfrom()是阻塞调用- 程序会等待直到收到数据
多客户端处理
- UDP服务端可以同时处理多个客户端
- 通过addr区分不同客户端
六、常见问题
Q1: 为什么客户端不需要bind?
A: 客户端第一次调用sendto()时,系统会自动分配一个可用端口。
Q2: 如果服务器没启动,客户端会怎样?
A: 客户端发送的数据会丢失,recvfrom()会一直等待(阻塞)。
Q3: 如何测试本机通信?
A: 服务端绑定127.0.0.1,客户端连接127.0.0.1。
Q4: 如何让其他电脑连接?
A:
- 服务端绑定
0.0.0.0或局域网IP - 关闭防火墙或开放对应端口
- 客户端使用服务器实际IP地址
七、完整的UDP还需要
- 异常处理:添加try-except处理网络错误
- 超时设置:使用settimeout()避免永久阻塞
- 多线程:同时处理多个客户端请求
- 数据验证:添加简单的协议头验证数据完整性
八、总结
UDP编程的核心模式:
- 服务端:创建→绑定→循环收发→关闭
- 客户端:创建→循环收发→关闭
这种简单的请求-响应模式是UDP编程的基础,理解了这种模式后,可以在此基础上构建更复杂的UDP应用。
注:实际使用时,请确保服务端和客户端的IP地址和端口号配置正确,防火墙已开放相应端口。