qt中记录数据的一次接收处理方法

引言

在udp通信中,发送请求后,等待接收端的响应,有时一个回应被分割成好几次发送,这种反馈的形式出现带有随机性,正常的情况下是一次反馈所有的数据,但是会出现一次反馈被分成好几次反馈。像下面这样:

请求:<history>
成功响应:<1,history,arg=78,total=1794,students=23><2,history,arg=65,total=1300,students=20><3,history,arg=73,total=1600,students=22>
<history,ok>
失败响应:<history,error>

发送请求后,接收端会返回给发送端所有的班级历史成绩的信息,本应该一次性返回,但是若随机出现接收端将要返回的数据分成好几次返回给发送端。像这样:

请求:<history>
响应:<1,history,arg=78,total=1794,students=23>

发送端接收到的数据并没有一次性返回,而是先接收一部分返回的数据,过一会儿后又接收到接收端返回的数据:

<2,history,arg=65,total=1300,students=20><3,history,arg=73,total=1600,students=22>

再过一会儿才接收到接收端返回的最后一句:

<history,ok>

上面描述的这种情况,本文记录的处理数据的方式,就是针对于上面所述的不能一次性返回一个响应给发送端。

方案

针对上面不能一次性返回一个响应的情况,下面来说一下如何接收这样的数据,使数据完整后再针对于上面的响应的格式来处理数据。

udp中常规接收数据的方式

 while (m_udp->hasPendingDatagrams()) {QByteArray byteArray;byteArray.resize(m_udp->pendingDatagramSize());QHostAddress ip;quint16 port;qint64 ret = m_udp->readDatagram(byteArray.data(),m_udp->pendingDatagramSize(),&ip,&port);qDebug()<<QStringLiteral("接收的数据:")<<byteArray.data()<<QStringLiteral("大小:")<<ret;}

上述不能一次性接收返回数据的情况不能用udp中常规接收数据的方式来接收,这样接收到的是一部分一部分的,需要再在数据处理里改动,为了使数据处理按照本文开始时给出的响应格式来解析,不改动数据处理部分,现在来调整接收数据的代码,使传送到数据处理时是一条完整的回复,当然必须满足响应数据一次性全部返回和响应数据一部分一部分的返回两种情况。

处理思路

如果是一次性返回响应的数据,直接传到数据解析函数中进行数据解析。
如果是一部分一部分的返回响应的数据,就将每一次返回的数据进行追加,构成一个字符串,直到接收到响应数据中含有<history,ok>或<history,error>将所有追加狗长城的字符串传入数据解析函数中。

处理实现

因为要数据进行追加成一个字符串,所以就需保存上一次的数据,将下一次接收的数据追击哀悼上一次数据的后面,直到最后接收到的数据中含<history,ok>或<history,error>。

QByteArray msgByteArray;//返回的数据是分开发送的(逐条发送),所以累计接收while (m_udp->hasPendingDatagrams()) {QByteArray byteArray;byteArray.resize(m_udp->pendingDatagramSize());QHostAddress ip;quint16 port;qint64 ret = m_udp->readDatagram(byteArray.data(),m_udp->pendingDatagramSize(),&ip,&port);msgByteArray.append(byteArray);}QString strTemp = msgByteArray;//临时保存接收的数据if (!strTemp.contains("ok")) {//是否接收数据中含有okif (strTemp.contains("error")) {//请求失败qDebug()<<QStringLiteral("接收的字节数:")<<msgByteArray.size()<<QStringLiteral("数据:")<<msgByteArray.data();m_interface->onReceviedData(msgByteArray);//将接收的一次完整的响应回调给数据处理函数}else {//只回应了一部分数据,后面还有数据//保存此次接收的数据,等到结束标志<history,ok>到来的时候,与接收标志的数据叠加m_partByteArray = msgByteArray;//保存每一次接收的数据,并追加后面收到的数据}}else {if (!m_partByteArray.isEmpty()) {m_partByteArray.append(msgByteArray);msgByteArray.clear();msgByteArray = m_partByteArray;//为了使发送的数据依旧是msgByteArray,同时满足当返回响应是失败m_partByteArray.clear();}//直到接收到一次完整的数据qDebug()<<QStringLiteral("接收的字节数:")<<msgByteArray.size()<<QStringLiteral("数据:")<<msgByteArray.data();m_interface->onReceviedData(msgByteArray);}

上面这段代码的逻辑,既能满足一次性接收完整的响应(成功,失败的响应),也能满足一部分一部分的接收一次响应。 m_interface->onReceviedData(msgByteArray);是将接收到的一次完整的响应数据已回调的方式传递到数据处理函数中。

领悟

在qt下udp通信中数据接收的方式,还是要根据自己项目的需求来做适当的修改,并不是是常规接收数据那样一成不变的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决ORA-00257: 归档程序错误。在释放之前仅限于内部连接

文章目录一、预先准备1. 现象2. 异常信息3. 分析二、解决方案2.1. 登录oracle2.2. 查看ARCHIVED LOG空间占用率2.3. 查看元空间大小2.4. 整空间上限2.5. 结果验证一、预先准备 1. 现象 场景1&#xff1a; 昨天尝试通过plsqldev尝试连接oracle数据库&#xff0c;报错&#xff…

qt中根据数据解析的结果动态的创建控件并布局

引言 有时候程序中的控件的个数是无法预测的&#xff0c;当程序启动时&#xff0c;根据解析的数据动态的创建n行m列的控件&#xff0c;并为其布局。下面记录一下动态创建控件&#xff0c;并布局。 运行效果 示例 此示例主要是从json配置文件中读取参数&#xff0c;然后根据参…

5分钟带你了解Kafka的技术架构 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;大家都知道 Kafka 是一个非常牛逼的消息队列框架&#xff0c;阿里的 RocketMQ 也是在 …

Mysql和Oracle 数据库操作工具类

适配Mysql和Oracle数据源 文章目录1. 适配Mysql和Oracle数据源2. 适配于Mysql数据源3. 适配Oeacle数据源1. 适配Mysql和Oracle数据源 package cn.stylefeng.guns.generator.core.util; import cn.stylefeng.guns.generator.modular.entity.DatabaseInfo; import lombok.extern…

QString类型转换为bool类型

方法 直接上代码 QString str "12.345";QVariant onLineTemp str;bool isValue onLineTemp.toBool();

Spark精华问答 | Spark的计算方法是什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Spark是一个针对超大数据集合的低延迟的集群分布式计算系统&#xff0c;比MapReducer快40倍左右&#xff0c;是hadoop的升级版本&#xff0c;Hadoop作为第一代产品使用HDFS&#xff0c;第二代加入了Cache来保存中间计算结果&#xf…

qt中创建控件布局以及删除原有布局和控件

引言 当根据数据来创建控件并布局时&#xff0c;如果数据更新&#xff0c;那么之前创建的控件便需要删除后重新创建布局。该文主要说明将原来的布局和控件删除&#xff0c;重新创建并布局。 示例 先看一下ui文件&#xff1a; 下面是实现代码&#xff1a; void StatusViewDi…

Spring精华问答 | Spring 能帮我们做什么?

Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持。今天就让我们一起来看看关于Spring的精华问答吧。1Q&#xff1a;什么是Spring框架&#xff1f;A&#xff1a;Spring框架是一个为Java应用程序的开发提供了综合、广泛的…

qt自定义控件的样式

引言 自定义控件创建后&#xff0c;有时需要设置样式&#xff0c;下面记录一下设置样式时需要注意的点。 注意 1.设置自定义控件的样式时&#xff0c;需要下面的代码&#xff1a; void paintEvent(QPaintEvent *event) {Q_UNUSED(event);QStyleOption opt;opt.init(this);Q…

linux 上传文件 rz命令 提示command not found 解决方法

-bash: rz: command not found rz命令没找到&#xff1f; 执行sz&#xff0c;同样也没找到。 安装lrzsz&#xff1a; yum -y install lrzsz现在就可以正常使用rz、sz命令上传、下载数据了。 使用方法&#xff1a; 上传文件 rz filename下载文件 sz filename

IoT与大数据 如何激发数字营销最大潜能?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;译者&#xff1a;风车云马 物联网与大数据概述物联网(IOT)简单理解&#xff0c;除了电…

qt中生成含有中文的json文件,读取含有中文的json文件

引言 之前将变量保存并在本地生成json文件&#xff0c;由于其中含有中文&#xff0c;导致生成的json文件出现乱码&#xff0c;或者就是生成的json文件没有乱码&#xff0c;但是读取生成的json文件时出现乱码&#xff0c;不能正常解析json. 示例 运行效果&#xff1a; 下面是…

年初新立Flag,新华三解决方案部做了点儿啥?

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;人人都提及的数字化时代&#xff0c;企业不想方设法提升效率怎么行&#xff1f…

qt中判断文件是否存在

实现 判断一个文件是否存在 bool isExistSpecificFile(QString strPath) {if (QFile::exists(strPath)) {return true;}return false; }注意&#xff1a; 这里的路径strPath是指文件所在的绝对路径&#xff0c;即完整的文件路径。

Docker - 实战TLS加密通讯

使用说明 演示环境(centos7,docker17.06.0-ce) 创建一个文件夹 mkdir /sslcd /ssl创建ca密钥 openssl genrsa -aes256 -out ca-key.pem 4096创建ca证书 openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN*" -out ca.pem创建服务器私钥 open…

qt中拖动窗口widget

提要 继承与QDialog的窗口&#xff0c;窗口原本按住标题栏可以拖动窗口&#xff0c;但是设置了窗口的隐藏标题栏属性后&#xff0c;窗口不再能够拖动。或者继承于QWidget的窗体&#xff0c;不具有窗口拖动功能。 本文实现继承于窗口widget或者继承于QDialog隐藏窗口标题栏的窗…

idea gblfy常用快捷键

gblfy日常快捷键&#xff1a; 关键词说明idea中对应的操作CTRL左方向光标向左跳跃一个单词Editor Actions -> Move Caret to Previous WordCTRL右方向光标向右跳跃一个单词Editor Actions -> Move Caret to Next Wordmianmian方法输入main后按着(自动提示)alt/sout快速打…

qt实现窗口拖动的两种思路

提要 窗口按下鼠标不放拖动窗口移动&#xff0c;鼠标释放的时候&#xff0c;停止拖动。这个过程可以用两种方法来实现。 1.鼠标点击后&#xff0c;获取鼠标按下点的坐标和起初窗口左上角的坐标&#xff0c;用鼠标按下点的坐标减去鼠标左上角的坐标&#xff0c;求出这个固定值。…

Linux怎么取消ftp的匿名访问功能

编辑vsftpd.conf: vim /etc/vsftpd/vsftpd.conf修改anonymous_enableYES 为 NO 保存退出 重起服务生效: /etc/init.d/vsftpd restart

看华为生态大学 如何玩转人才生态?

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;从孔子兴私学开始&#xff0c;千百年来&#xff0c;中国人在私塾中开始或完成自…