Udp发送和接收数据(python和QT)
服务端代码 (python)
import socketdef udp_server(host='0.0.0.0', port=12345):# 创建一个UDP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定服务器的IP地址和端口号sock.bind((host, port))print(f"UDP服务器已启动,监听端口 {port}...")try:while True:# 接收来自客户端的数据包data, addr = sock.recvfrom(1024) # 1024是缓冲区大小# 打印接收到的数据和客户端地址print(f"接收到来自 {addr} 的数据: {data.decode()}")# 构造响应数据response = f"服务器已接收到来自 {addr} 的数据: {data.decode()}"# 向客户端发送响应数据包sock.sendto(response.encode(), addr)# 打印发送响应的确认print(f"已向 {addr} 发送响应数据")except KeyboardInterrupt:print("服务器接收到中断信号,正在关闭...")finally:# 关闭套接字sock.close()print("服务器已关闭")# 运行UDP服务器
udp_server()
在这个示例中,服务器使用recvfrom方法接收数据包,该方法会阻塞直到接收到一个数据包。数据包包含两部分:数据本身和客户端的地址(IP地址和端口号)。
注意,虽然这个服务器代码看起来是顺序执行的,但实际上UDP套接字能够同时接收多个数据包。当多个数据包同时到达时,它们会被放入操作系统的网络缓冲区中,recvfrom方法会依次处理这些数据包。因此,服务器能够“同时”处理多个客户端的请求,尽管在代码层面上它是顺序处理的。
对于UDP来说,由于每个数据包都是独立的,并且没有建立持久的连接,所以通常不需要像TCP那样为每个客户端创建单独的线程或进程。
客户端:
如果程序在发送数据之前没有绑定端口,那么每次发送数据时,系统可能会分配一个新的端口号。这是因为UDP协议本身不要求在通信双方之间建立连接,因此每次发送数据时都可以使用不同的端口号。在接收端收到数据之后,系统又会自动释放掉这个端口号1。
但是,如果程序在发送数据之前绑定了特定的端口,那么只要程序不退出,它就会一直使用这个绑定的端口来发送消息。即使多次发送数据,端口号也不会改变,除非程序重新启动或显式地解绑并重新绑定到另一个端口。
UDP通信通常不区分严格的客户端和服务器角色,因为UDP是无连接的协议。不过,为了说明问题,我们可以将两个实体分别称为“发送者”(可以视作客户端)和“接收者”(可以视作服务器),尽管它们在UDP中实际上是对等的。
以下是 QT代码的实现
客户端(qt)
#include <QCoreApplication>
#include <QUdpSocket>
#include <QByteArray>
#include <QHostAddress>
#include <QTimer>
#include <QDebug>class UdpClient : public QObject {Q_OBJECTpublic:UdpClient(QObject *parent = nullptr): QObject(parent), udpSocket(new QUdpSocket(this)) {// 定时器用于定期发送数据QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &UdpClient::sendDatagram);timer->start(1000); // 每秒发送一次// 连接接收信号到槽函数connect(udpSocket, &QUdpSocket::readyRead, this, &UdpClient::readPendingDatagrams);}private slots:void sendDatagram() {QByteArray datagram = "Hello from Client!";udpSocket->writeDatagram(datagram, QHostAddress::LocalHost, 12345);qDebug() << "Sent datagram:" << datagram;}void readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received datagram from" << sender.toString() << ":" << senderPort;qDebug() << datagram;}}private:QUdpSocket *udpSocket;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);UdpClient client;return a.exec();
}#include "main.moc"
服务端(qt)
#include <QCoreApplication>
#include <QUdpSocket>
#include <QByteArray>
#include <QDebug>class UdpServer : public QObject {Q_OBJECTpublic:UdpServer(QObject *parent = nullptr): QObject(parent), udpSocket(new QUdpSocket(this)) {// 绑定接收端口udpSocket->bind(12345);// 连接接收信号到槽函数connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams);}private slots:void readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received datagram from" << sender.toString() << ":" << senderPort;qDebug() << datagram;// 发送响应给客户端QByteArray response = "Hello from Server!";udpSocket->writeDatagram(response, sender, senderPort);qDebug() << "Sent response:" << response;}}private:QUdpSocket *udpSocket;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);UdpServer server;return a.exec();
}#include "main.moc"
FR:徐海涛(hunkxu)
相关文章:
Udp发送和接收数据(python和QT)
服务端代码 (python) import socketdef udp_server(host0.0.0.0, port12345):# 创建一个UDP套接字sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定服务器的IP地址和端口号sock.bind((host, port))print(f"UDP服务器已启动,监听端口 {port}...&…...
element-plus 根据条件显示多选框
代码如下: <el-table :data"pager.lists" selection-change"handleSelectionChange" row-key"id" :tree-props"{ checkStrictly: true }" :cell-class-name"cellClass"> <el-table-column type"s…...
Ubuntu 22.04 Install deepseek
前言 deepseekAI助手。它具有聊天机器人功能,可以与用户进行自然语言交互,回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括: 强大的语言理解能力:能够理解和生成自然语言,与用户进行流畅的对话。多领域知识&…...
DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑
DeepSeek作为一款前沿的人工智能大模型,凭借其强大的多模态理解、知识推理和内容生成能力,正在重构文旅产业的发展逻辑,推动行业从传统的经验驱动向数据驱动、从人力密集型向智能协同型转变。 一、智能服务重构:打造全域感知的智…...
小程序的分包
1.分包的概念以及基本用法 2.在小程序项目里面添加自己的分包 3.给分包加上别名 4.查看分包体积大小 5.分包的打包原则 6.分包的引用原则 7.独立分包 8.分包的预下载...
RTSP场景下RTP协议详解及音视频打包全流程
RTSP场景下RTP协议详解及音视频打包全流程 一、RTSP与RTP的关系 RTSP:负责媒体会话控制(DESCRIBE、SETUP、PLAY、PAUSE),通过SDP协商传输参数(端口、编码格式、封装模式)。RTP:实际传输音视频数…...
使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...
如何基于transformers库通过训练Qwen/DeepSeek模型的传统分类能力实现文本分类任务
文章目录 模型与环境准备文档分析源码解读模型训练及推理方式进阶:CPU与显存的切换进阶:多卡数据并行训练🔑 DDP 训练过程核心步骤🚫 DDP 不适用于模型并行⚖️ DDP vs. Model Parallelism⚙️ 解决大模型训练的推荐方法🎉进入大模型应用与实战专栏 | 🚀查看更多专栏…...
开源一款I2C电机驱动扩展板-FreakStudio多米诺系列
总线直流电机扩展板 原文链接: FreakStudio的博客 摘要 设计了一个I2C电机驱动板,通过I2C接口控制多个电机的转速和方向,支持刹车和减速功能。可连接16个扩展板,具有PWM输出、过流过热保护和可更换电机驱动芯片。支持按键控制…...
FFmpeg+WebSocket+JsMpeg实时视频流实现方案
之前写的使用FFmpeg Nginx HLS流媒体播放方案,适合对实时性要求不高的需求,存在延迟,FFmpeg需要将视频流存储到本地文件,而本次方案FFmpeg不需要将视频流存储到本地文件,而是直接将转换后的视频流(如MJPE…...
【Linux】Linux 文件系统—— 探讨软链接(symbolic link)
ℹ️大家好,我是练小杰,周五又到了,明天应该就是牛马的休息日了吧!!😆 前天我们详细介绍了 硬链接的特点,现在继续探讨 软链接的特点,并且后续将添加更多相关知识噢,谢谢…...
排序与算法:插入排序
执行效果 插入排序的执行效果是这样的: 呃……看不懂吗?没关系,接着往下看介绍 算法介绍 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,…...
HashMap 详解
一、核心特性 HashMap集合的key是无序不可重复的。 ①无序:插入顺序和取出顺序不一定相同。 ②不可重复:key具有唯一性。 向HashMap集合中put时,key如果重复的话,value会覆盖。 二、HashMap集合的key具有唯一性,向ke…...
DAY07 Collection、Iterator、泛型、数据结构
学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…...
计算机网络之物理层——基于《计算机网络》谢希仁第八版
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
简讯:Rust 2024 edition and v1.85.0 已发布
详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法:rustup update stable...
DeepSeek写俄罗斯方块手机小游戏
DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件: 核心功能要求 原生JavaScript实现,适配手机屏幕 …...
uniapp中引入Vant Weapp的保姆级教学(包含错误处理)
废话不多说,直接上方法,网上的教学好多都是错误的 1.安装vant weapp 在Hbuilder的终端,输入以下代码 npm install vant/weapp -S --production 2.新建wxcomponents文件夹 在项目的跟目录新建一个“wxcomponents’文件夹,与app.…...
【Python爬虫(20)】解锁Python爬虫数据存储秘籍:文件存储全攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
关于Unity的一些基础知识点汇总
1.Prefab实例化后,哪些资源是共用的?哪些资源是拷贝的? 共用资源 脚本组件:实例化后的 Prefab 共享脚本组件的代码。若脚本中无状态数据,多个实例对脚本方法的调用会有相同逻辑。比如一个控制物体移动的脚本࿰…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
