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字节内
  • 多线程操作共享数据需加锁
  • 文件传输必须使用二进制模式
相关推荐
郝学胜-神的一滴3 分钟前
力扣 144:二叉树前序遍历的优雅实现
java·数据结构·c++·python·算法·leetcode·职场和发展
拾年2754 分钟前
NumPy数组创建完全指南:从零搭建你的数字积木城
python·机器学习·numpy
王小菲8 分钟前
你能在泰坦尼克号上活下来吗-利用python进行探索性数据分析
python
Evand J8 分钟前
【MATLAB程序】基于σ修正自适应律的多无人机菱形编队控制仿真,附下载链接
开发语言·matlab·无人机·控制·编队飞行·多uav
risc1234568 分钟前
【Lucene】理解不是看见光,而是让眼睛适应黑暗
java·开发语言
枕星而眠8 分钟前
C++面向对象核心:类间关系与继承深度解析
运维·开发语言·c++·后端
秋越9 分钟前
从工程角度理解嵌入式C语言关键字
c语言·开发语言·嵌入式·嵌入式软件开发·嵌入式c语言·c语言关键字
FBI HackerHarry浩10 分钟前
在Python中TCP网络程序开发的步骤流程
运维·服务器·开发语言·网络·python·pycharm
方也_arkling11 分钟前
【Java-Day16】API篇-Math类/System类/Object类/包装类
java·开发语言
x***r15111 分钟前
burpsuite-1.4.07.jar 使用步骤详解(附Java环境配置与Burp Suite抓包教程)
java·开发语言·jar