风起云涌的时间 2019-07-18 23:15 采纳率: 100%
浏览 267
已结题

请问我下面的代码对吗?能实现对数据的拆包和并包吗?

请问我下面的代码对吗?能实现对数据的拆包和并包吗?
如果不能哪里出了问题麻烦大神给我指出来下

void SocketWidget::onSocketReadyRead()
{

if(tcpSocket->bytesAvailable() <= 0)
{
    return;
}
qint64 totalBytes = 0;
m_buffer = NULL;
//从缓存区去除数据,但是不确定取出来的字节数;
QByteArray buffer= tcpSocket->readAll();
m_buffer.append(buffer);
unsigned int totalLen = m_buffer.size();
textEditRead->append(buffer);
 //这边确实需要利用长度做while循环,因为有可能一下子读取到两条以上的完整记录,就需要进行循环处理了;
//超过一条完整小于第二条完整记录时,如果已经达到包头长度就先把包头保存下来,整个过程循环往复
while (totalLen)
{
    //与QDataStream绑定,方便操作
    QDataStream packet(m_buffer);
    packet.setVersion(QDataStream::Qt_5_10);
    //不够包头长度的不处理,结束while循环
    unsigned int MINSIZE = sizeof(qint64)*2;
    if(totalLen < MINSIZE)
    {
       //textEditRead->append(buffer);

        break;
    }
    //将包头读入了进来按照定义的协议,先读命令长度,再读命令的类型;
    packet >> totalBytes >>serverCmd;
    //缓存中的内容长度没有达到命令的长度,那就先结束,等足够了再来解析
    if(totalLen<totalBytes)
        break;
    //足够长了就开始解析
          // QDir dir(sysFilePath);      //系统文件目录
          // if(!dir.exists())
             //  dir.mkdir(sysFilePath);
    switch (serverCmd)
    {
    case QString_recv:
    {
        qDebug()<<"开始接收字符串...";
        QByteArray datas = m_buffer.mid(MINSIZE,totalBytes-MINSIZE);
        QString strInfo;//数据包中的message
        strInfo.prepend(datas);
        qDebug() <<strInfo;//输出接收到的QString

    }

        break;
    default:
        //qint64 nbytes = tcpSocket->bytesAvailable();
        //textEditRead->append(buffer);
        break;
    }
    //缓存多余的数据
         buffer = m_buffer.right(totalLen - totalBytes); //截取下一个数据包的数据,留作下次读取
        totalLen = buffer.size();
        //更新多余的数据
        m_buffer = buffer;



}

/* while (tcpSocket->bytesAvailable() > 0)
{
qint64 nbytes = tcpSocket->bytesAvailable();
QByteArray array = tcpSocket->read(nbytes);
textEditRead->append(array);

}*/

}

  • 写回答

2条回答 默认 最新

  • dabocaiqq 2019-07-19 09:34
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?