c++ - 在 Qtcp readyRead() 中读取可变长度消息

标签 c++ qt qtcpsocket

以下代码旨在显示通过网络发送的图像。我发送了一个 16 字节的 header ,我用它来计算后面的图像大小,然后读取那么多字节并显示图像。 我在此链接中使用了这个概念 Tcp packets using QTcpSocket

void socket::readyRead()
{ 

while(socket->bytesAvailable() > 0) {
    quint8 Data[16];

    socket->read((char *)&Data,16);
    img_size = (((quint8)Data[1]<<8)+ (quint8)Data[0]) * (((quint8)Data[3]<<8)+ (quint8)Data[2]) * 1;
    QByteArray buffer = socket->read(img_size);


    while(buffer.size() < (img_size))
         {
            // qDebug() << buffer.size();
              socket->waitForReadyRead();
              buffer.append(socket->read((img_size)-(buffer.size()) ));
          }
    unsigned char* imgdatara = (unsigned char*)&buffer.data()[0];
      if( !image )
       image =  new QImage(imgdatara,32,640,QImage::Format_Grayscale8);
      else
      {
      delete image;
      image =  new QImage(imgdatara,32,640,QImage::Format_Grayscale8);
      }

      emit msg(image);
   }     
 }

我的 GUI 显示“无响应”。我该如何解决?

谢谢

最佳答案

这是 Max Schlee 的“Qt 4.8 专业编程”一书中的 100% 工作代码。这不是一个简单的问题,因为在 readyRead() 信号上你可以收到:
1.一个完整的区 block
2.只有一部分block
3.几个 block 在一起

void MyClass::onReceive()
{
    QDataStream in(m_pClient);
    in.setVersion(QDataStream::Qt_4_6); // Your version. Not necessary.

    for(;;)
    {
        if(m_nextBlockSize == 0)
        {
            if(m_pClient->bytesAvailable() < sizeof(m_nextBlockSize))
            {
                break;
            }
            else
            {
                in >> m_nextBlockSize; 
            }
        }

        if(m_pClient->bytesAvailable() < m_nextBlockSize)
        {
            break;
        }

        // Here you have each complete block
        processYourBlockHere(); // <=====

        m_nextBlockSize = 0;
    }
}

更新:对您有用的链接:Serializing Qt Data TypesQDataStream

关于c++ - 在 Qtcp readyRead() 中读取可变长度消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35311474/

相关文章:

c++ - QT特别评论//://[num] etc

c++ - 无法在 Release模式下从字节数组加载 QImage

c++ - 从 QTcpSocket 读取(许多)值(快速)

C++在末尾计算跳跃范围

c++ - Boost Regex 不会编译

c++ - 将遗留的 c 枚举包装到 c++11 枚举类

qt - 在 QML 中创建一个矩形的副本

c++ - QWidget findChildren when objectname contains a specific string

c++ - 无法为处于不同线程中的父对象创建子对象

c++ - 初始化模板对象