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粘包问题相关推荐

  1. QT TCP粘包问题解决方案

    tcp中当两包数据发送间隔很短的时候,接收的时候就会出现两个包粘在一起的情况,也就是粘包. a.简单的解决方法:控制发送间隔,使用定时器延时(图形界面不要用sleep除非开线程)让不能黏在一起的包分开 ...

  2. Qt中对TCP粘包的处理

    当时用TCP协议传输数据时,经常出现粘包的现象 当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方? 1.服务器?服务器已经发出数据了 2.网线?数据应该在内存,怎么会在 ...

  3. 【Netty】入门Netty官方例子解析(三)处理一个基于流的传输 TCP粘包和拆包问题分析和解决

    关于 Socket Buffer的一个小警告 基于流的传输比如 TCP/IP, 接收到数据是存在 socket 接收的 buffer 中.不幸的是,基于流的传输并不是一个数据包队列,而是一个字节队列. ...

  4. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  5. tcp协议缓冲区溢出_关于TCP 粘包拆包,你了解吗?

    一.什么是粘包拆包? 粘包拆包是TCP协议传输中一种现象概念.TCP是传输层协议,他传输的是"流"式数据,TCP并不知道传输是哪种业务数据,或者说,并不关心.它只是根据缓冲区状况将 ...

  6. 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)

    一.粘包/拆包概念 TCP是一个"流"协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的 ...

  7. Netty详解(五):Netty TCP粘包 拆包

    1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...

  8. 网络:TCP粘包问题?如何解决?

    看面经时,看到有面试官问TCP的粘包问题.想起来研一做购物车处理数据更新时遇到粘包问题,就总结一下吧. 1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看, ...

  9. 6行代码解决golang TCP粘包

    什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现自定义协议解包. 协议数据包定义 本文模拟一个日志服务器,该服务器接收客户端传到的数 ...

最新文章

  1. python自动化脚本实例100条-自动化运维基础实例解析-Python批量登录到服务器执行任务...
  2. [转]MongoDB c++驱动安装与使用
  3. python中的argparse包——用于解析命令行参数
  4. 蔡超:入门 Go 语言必须跨越的五个思维误区
  5. mysql 1280_技术分享 | MySQL 一次奇怪的故障分析
  6. JAVA——附加作业1——统计员工数
  7. 在线MG小游戏html5源码
  8. iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架
  9. 在知行EDI系统中实施SNIP验证
  10. 苹果iPad手机如何无线投屏电脑使用教程
  11. mysql 数据库大小写敏感(数据库的名字、表名字、字段名字、字段值)
  12. 怎么缩小图片大小kb
  13. 数据库系统原理与应用教程(006)—— 编译安装 MySQL5.7(Linux 环境)
  14. 1976年图灵奖--米凯尔·拉宾和达纳·斯科特简介
  15. java unicode 我爱你,各语言解决\\u6211%u6211\u6211问题
  16. 数据库中的 “行式存储”和“列式存储”
  17. QP/区块链服务器被攻击了怎么办?
  18. 2-灵魂存在与否的论证(1)(耶鲁大学公开课-哲学-死亡)
  19. 视频加密后的录屏行为怎么做防范?
  20. 五、SQL–索引/约束④(check约束)

热门文章

  1. 电脑系统重装win10的方法教程,win10系统重装教程
  2. CodeCraft-20 (Div. 2)(C(本原多项式) D (BFS) E (状压+dp))
  3. java波斯王子时之沙_我的世界Java版21w07a版本更新内容详情
  4. 成功的艺术家临摹,伟大的艺术家剽窃
  5. SEO关键词排名-百度点击软件(刷关键词排名、百度指数、百度相关、竞价点击-全能软件)
  6. nvim代码格式化插件formatter.nvim
  7. M.2的SATA和M.2的NVME协议的区别
  8. chrome浏览器控制台创建js脚本并执行
  9. spark+carbondata使用
  10. 【PyQt5】孩子要上小学了,写个软件做练口算吧!