UDP 套接字编程核心实现
以下讲的代码为Python UDP 套接字编程 的完整实战合集,包含 4 大核心部分:
- UDP 基础通信(收发文本)
- UDP 传输文件(图片)
- UDP 多线程群聊服务器
- UDP 群聊客户端
UDP 特点:无连接、不可靠、速度快、适合广播 / 群聊 / 视频通话,不需要像 TCP 一样先建立连接。
基础语法结构
python
import socket
socket_obj = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_obj.bind(('127.0.0.1', 8888)) # 服务端专用
data, addr = socket_obj.recvfrom(1024)
socket_obj.sendto(b"data", ('ip', port))
socket_obj.close()
文本通信实现
服务端代码:
python
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8888))
data, addr = server.recvfrom(1024)
server.sendto(b"response", addr)
- AF_INET:使用 IPv4 地址
- SOCK_DGRAM:UDP 协议(关键)
客户端代码:
python
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"hello", ('127.0.0.1', 8888))
data, _ = client.recvfrom(1024)
文件传输方案
1. 服务端(接收 + 回复)
步骤:创建套接字 → 绑定 → 接收 → 发送 → 关闭
python
import socket
# 1. 创建UDP套接字
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定地址
server.bind(('127.0.0.1', 8888))
# 3. 接收数据
data, addr = server.recvfrom(1024)
print("收到:", data.decode('utf-8'))
# 4. 回复数据
server.sendto(b"hello client", addr)
# 5. 关闭
server.close()
2. 客户端(发送 + 接收)
步骤:创建套接字 → 发送 → 接收 → 关闭
python
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送消息给服务端
client.sendto("你好服务器".encode('utf-8'), ('127.0.0.1', 8888))
# 接收回复
data, addr = client.recvfrom(1024)
print("服务器回复:", data.decode())
client.close()
UDP 传输图片(二进制文件)
原理:把图片读成二进制字节,直接用 sendto/recvfrom 传输
服务端(发送图片)
python
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8888))
# 1. 接收客户端消息
data, addr = server.recvfrom(1024*1024)
# 2. 读取本地图片(二进制模式)
with open("test.jpg", "rb") as f:
img_data = f.read()
# 3. 发送图片
server.sendto(img_data, addr)
server.close()
客户端(接收并保存图片)
python
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 先发指令
client.sendto(b"recv", ('127.0.0.1', 8888))
# 接收图片二进制数据
img_data, _ = client.recvfrom(1024*1024)
# 写入文件保存
with open("recv.jpg", "wb") as f:
f.write(img_data)
client.close()
UDP 多人群聊系统(核心重点)
多线程 UDP 群聊服务器 + 客户端
- 群聊服务器功能总结
- 支持多客户端同时在线
- 自动记录在线客户端列表
- 消息广播(发给所有人)
- 上线 / 下线自动通知
- 线程安全(加锁防止数据错乱)
- 服务器核心原理
- 主线程:循环接收所有客户端消息
- 子线程:单独处理每个客户端消息
- 广播函数:遍历在线列表,把消息发给所有人
- 线程锁:多线程修改客户端列表时避免冲突
关键代码说明
- clients = set():存储所有在线客户端地址(自动去重)
- Lock():线程锁,保证数据安全
- broadcast():广播方法,群发消息
- 上线发送 [上线],下线发送 [下线]
2. 群聊客户端功能总结
- 启动自动发送[上线]
- 独立线程持续接收消息(不影响输入)
- 主线程负责输入发送消息
- 输入 bye 或按 Ctrl+C 自动下线
- 实时显示群聊消息
- 客户端核心原理
- 收消息线程:后台一直运行,接收服务器广播
- 发消息主线程:用户输入消息,发送给服务器
- 服务器中转消息 → 实现群聊
协议特性对比
| 特性 | UDP优势 | TCP优势 |
|---|---|---|
| 连接方式 | 无连接 | 面向连接 |
| 传输效率 | 更高(头部开销小) | 可靠但效率较低 |
| 适用场景 | 实时音视频/游戏/广播 | 文件传输/网页 |
关键注意事项
- 数据必须转为字节格式:
str.encode()/bytes.decode() - 服务端必须绑定固定端口
- UDP单次传输限制在65507字节内
- 多线程操作共享数据需加锁
- 文件传输必须使用二进制模式