QT tcp粘包问题
QT tcp粘包问题
2016年12月27日 23:50:06 月下独奏 阅读数 1282更多
分类专栏: QT
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/d7185540/article/details/53900603
当两次发送时间过短,两次发送的数据包将会合成一个,对数据解读也就会出现错误。
解决方法:对数据进行包装,分为两部分,前面一部分存储数据总共的大小,后面一部分存储数据;
下面为例子
void transmission::readMessage() //连接信号槽,当有数据时触发
{
QByteArray xinxi;
qDebug()<<"有数据传输!!";
qDebug()<<"bytesAvailable"<<tcpSocket->bytesAvailable()<<" ";
while(tcpSocket->bytesAvailable()>0)
{
QDataStream dts(tcpSocket);
/*********bytesreceived为0就为第一次接收 ************/
if(bytesreceived==0)
{
qDebug()<<"第一次接受";
//|如果是第一次接收
if(tcpSocket->bytesAvailable()>=sizeof(qint64))
{
//|如果发送完了 总大小数据块
// qDebug()<<sizeof(qint64);
dts>>bytestotal;
qDebug()<<"总共大小"<<bytestotal;
//bytestotal是这个包的数据大小
bytesreceived+=sizeof(qint64);
if(bytesreceived+tcpSocket->bytesAvailable()==bytestotal)
{
//|如果第一次响应(一次性就发送了所有数据)就接收
qDebug()<<"一次性接受完成";
dts>>xinxi;
QString json_str(xinxi);
message=json_str;
/*********** 此次数据发送动作完毕*********清除一些成员属性*****方便于不断开连接情况下 第二次发送数据******/
bytesreceived=0;
bytestotal=0;
reciverfinish=true;
}
else if(bytesreceived+tcpSocket->bytesAvailable()>bytestotal) //已经接受的数据加上未接受的数据大于包的数据,明显是粘包了
{ 进行处理
dts>>xinxi;
qDebug()<<"发生粘包"<<xinxi.size();
qDebug()<<tcpSocket->bytesAvailable();
bytesreceived=0;
reciverfinish=true;
bytestotal=0;
// dts.readBytes()
}
}
else
{
}
}
else
{
/*******bytesreceived不为0 则不为第一次 响应(这个文件很大,或者 网络状态不是很好)*********/
/*****************
* 每次就会响应这里 直到 数据接收够了 为止
******************/
if(bytesreceived+tcpSocket->bytesAvailable()>=bytestotal)
{
qDebug()<<"多次接受完成数据";
dts>>xinxi;
QString json_str(xinxi);
message=json_str;
qDebug()<<message;
// this->ui->textBrowser->append(QString::number(this->bytestotal)+"----"+data+"<br/>");
/*********** 此次数据发送动作完毕*********清除一些成员属性**方便于不断开连接情况下 第二次发送数据*********/
bytesreceived=0;
reciverfinish=true;
bytestotal=0;
}
}
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(xinxi, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
Processingjsondata(xinxi);
}
else if(parse_doucment.isArray())
{
// qDebug()<<"是JSONARRAY数据";
Processingjsonarraydate(xinxi);
}
else
{
// qDebug()<<"无法识别数据";
}
}
else
qDebug()<<json_error.error;
QTime t;
t.start();
while(t.elapsed()<10)
QCoreApplication::processEvents();
}
}
QT tcp粘包问题相关推荐
- QT TCP粘包问题解决方案
tcp中当两包数据发送间隔很短的时候,接收的时候就会出现两个包粘在一起的情况,也就是粘包. a.简单的解决方法:控制发送间隔,使用定时器延时(图形界面不要用sleep除非开线程)让不能黏在一起的包分开 ...
- Qt中对TCP粘包的处理
当时用TCP协议传输数据时,经常出现粘包的现象 当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方? 1.服务器?服务器已经发出数据了 2.网线?数据应该在内存,怎么会在 ...
- 【Netty】入门Netty官方例子解析(三)处理一个基于流的传输 TCP粘包和拆包问题分析和解决
关于 Socket Buffer的一个小警告 基于流的传输比如 TCP/IP, 接收到数据是存在 socket 接收的 buffer 中.不幸的是,基于流的传输并不是一个数据包队列,而是一个字节队列. ...
- Socket编程(4)TCP粘包问题及解决方案
① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...
- tcp协议缓冲区溢出_关于TCP 粘包拆包,你了解吗?
一.什么是粘包拆包? 粘包拆包是TCP协议传输中一种现象概念.TCP是传输层协议,他传输的是"流"式数据,TCP并不知道传输是哪种业务数据,或者说,并不关心.它只是根据缓冲区状况将 ...
- 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)
一.粘包/拆包概念 TCP是一个"流"协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的 ...
- Netty详解(五):Netty TCP粘包 拆包
1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...
- 网络:TCP粘包问题?如何解决?
看面经时,看到有面试官问TCP的粘包问题.想起来研一做购物车处理数据更新时遇到粘包问题,就总结一下吧. 1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看, ...
- 6行代码解决golang TCP粘包
什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现自定义协议解包. 协议数据包定义 本文模拟一个日志服务器,该服务器接收客户端传到的数 ...
最新文章
- python自动化脚本实例100条-自动化运维基础实例解析-Python批量登录到服务器执行任务...
- [转]MongoDB c++驱动安装与使用
- python中的argparse包——用于解析命令行参数
- 蔡超:入门 Go 语言必须跨越的五个思维误区
- mysql 1280_技术分享 | MySQL 一次奇怪的故障分析
- JAVA——附加作业1——统计员工数
- 在线MG小游戏html5源码
- iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架
- 在知行EDI系统中实施SNIP验证
- 苹果iPad手机如何无线投屏电脑使用教程
- mysql 数据库大小写敏感(数据库的名字、表名字、字段名字、字段值)
- 怎么缩小图片大小kb
- 数据库系统原理与应用教程(006)—— 编译安装 MySQL5.7(Linux 环境)
- 1976年图灵奖--米凯尔·拉宾和达纳·斯科特简介
- java unicode 我爱你,各语言解决\\u6211%u6211\u6211问题
- 数据库中的 “行式存储”和“列式存储”
- QP/区块链服务器被攻击了怎么办?
- 2-灵魂存在与否的论证(1)(耶鲁大学公开课-哲学-死亡)
- 视频加密后的录屏行为怎么做防范?
- 五、SQL–索引/约束④(check约束)
热门文章
- 电脑系统重装win10的方法教程,win10系统重装教程
- CodeCraft-20 (Div. 2)(C(本原多项式) D (BFS) E (状压+dp))
- java波斯王子时之沙_我的世界Java版21w07a版本更新内容详情
- 成功的艺术家临摹,伟大的艺术家剽窃
- SEO关键词排名-百度点击软件(刷关键词排名、百度指数、百度相关、竞价点击-全能软件)
- nvim代码格式化插件formatter.nvim
- M.2的SATA和M.2的NVME协议的区别
- chrome浏览器控制台创建js脚本并执行
- spark+carbondata使用
- 【PyQt5】孩子要上小学了,写个软件做练口算吧!