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字节内
  • 多线程操作共享数据需加锁
  • 文件传输必须使用二进制模式
相关推荐
qq_189807032 小时前
Navicat导出JSON数据为空如何解决_过滤条件与权限排查
jvm·数据库·python
2301_813599552 小时前
HTML表单能嵌套吗_表单嵌套限制与替代方案【解答】
jvm·数据库·python
wearegogog1232 小时前
光伏发电系统最大功率跟踪(MPPT)算法 Matlab 实现指南
开发语言·算法·matlab
yejqvow122 小时前
如何使用可视化查询生成器_免敲代码的多表JOIN配置
jvm·数据库·python
小小码农Come on2 小时前
QML怎么使用C++多线程编程
开发语言·c++
2301_815279522 小时前
学生党预算有限怎么选HTML函数工具_低配高性价比教程【教程】
jvm·数据库·python
努力进修2 小时前
【java-数据结构】Java优先级队列揭秘:堆的力量让数据处理飞起来
java·开发语言·数据结构
@hhr2 小时前
使用java对接火山方舟doubao-seedance-1.5-pro 模型进行视频生成
java·python·音视频
廋到被风吹走2 小时前
【LangChain4j】Java 生态中最灵活、功能最强大的纯 Java 大模型应用开发框架(支持声明式@AiService与复杂RAG/Agent)
java·开发语言·python