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字节内
  • 多线程操作共享数据需加锁
  • 文件传输必须使用二进制模式
相关推荐
维吉斯蔡5 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
幻影123!5 小时前
从零训练一个会下五子棋的AI
python·深度学习·神经网络·强化学习·五子棋·alpha zero·mokugo
Python私教6 小时前
Django 接入 AI 大模型实战:从零做一个流式聊天网站
人工智能·python·django
Python私教6 小时前
Django 接入 MCP 实战:让 AI 安全调用数据库和业务接口
人工智能·python·django
Python私教7 小时前
Django 搭建 AI 本地知识库:文档上传、向量检索与智能问答
人工智能·python·django
luj_17687 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
always_TT7 小时前
【Python 日志记录:logging 模块入门】
开发语言·python·php
xcLeigh7 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
zmzb01038 小时前
C++课后习题训练记录Day175
开发语言·c++
脱胎换骨-军哥8 小时前
C++ 代码规范与格式化指南
开发语言·c++·代码规范