【问题标题】:Reading Variable length messages in Qtcp readyRead()在 Qtcp readyRead() 中读取可变长度消息
【发布时间】:2016-05-20 14:02:05
【问题描述】:

以下代码旨在显示通过网络发送的图像。我发送了一个 16 字节的标头,用于计算随后的图像大小,然后读取那么多字节并显示图像。 我在这个链接上使用了这个概念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 显示“没有响应”。我该如何解决这个问题?

谢谢

【问题讨论】:

    标签: c++ qt qtcpsocket


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-16
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      相关资源
      最近更新 更多