python 第21课 基础完结(UDP套接字)

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 群聊服务器 + 客户端

  1. 群聊服务器功能总结
  • 支持多客户端同时在线
  • 自动记录在线客户端列表
  • 消息广播(发给所有人)
  • 上线 / 下线自动通知
  • 线程安全(加锁防止数据错乱)
  • 服务器核心原理
  • 主线程:循环接收所有客户端消息
  • 子线程:单独处理每个客户端消息
  • 广播函数:遍历在线列表,把消息发给所有人
  • 线程锁:多线程修改客户端列表时避免冲突

关键代码说明

  • clients = set():存储所有在线客户端地址(自动去重)
  • Lock():线程锁,保证数据安全
  • broadcast():广播方法,群发消息
  • 上线发送 上线,下线发送 下线

2. 群聊客户端功能总结

  • 启动自动发送上线
  • 独立线程持续接收消息(不影响输入)
  • 主线程负责输入发送消息
  • 输入 bye 或按 Ctrl+C 自动下线
  • 实时显示群聊消息
  • 客户端核心原理
  • 收消息线程:后台一直运行,接收服务器广播
  • 发消息主线程:用户输入消息,发送给服务器
  • 服务器中转消息 → 实现群聊

协议特性对比

特性 UDP优势 TCP优势
连接方式 无连接 面向连接
传输效率 更高(头部开销小) 可靠但效率较低
适用场景 实时音视频/游戏/广播 文件传输/网页

关键注意事项

  • 数据必须转为字节格式:str.encode()/bytes.decode()
  • 服务端必须绑定固定端口
  • UDP单次传输限制在65507字节内
  • 多线程操作共享数据需加锁
  • 文件传输必须使用二进制模式
相关推荐
李妍.41 分钟前
02Numpy基础(上)
开发语言·python
TheBestRucy43 分钟前
Python 九阳神功之贰:面向对象(下)
开发语言·python
2601_965958461 小时前
口腔黏膜脱皮超2周未愈建议及时就医
人工智能·python
AI_小站2 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
微小冷2 小时前
在不同空间中展示数据(欧式、球面、庞加莱圆盘)
python·双曲空间·微分几何·geomstats·庞加莱圆盘·球面
felixking2 小时前
C++20 协程
开发语言·c++·协程
xiaoye-duck3 小时前
《Linux网络编程》UDP Socket 编程实战:从 Echo 回显、通用字典服务到套接字封装全流程
linux·网络·udp
weixin_431600443 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
讲温控就好了3 小时前
从医疗影像到能源存储——芯片冷却温控技术的跨行业赋能
人工智能·python·能源
DeepVisionary3 小时前
从 Qwen3.8-27B 把原生多模态、原生 FP8、桌面级 Agent 三件事一次集齐,看开源大模型的“工业化拐点“
python·自动化