使用QTcpSocket发送/接收QImage

时间:2018-11-19 15:58:18

标签: ipc qimage qtcpsocket qtcpserver

我正在开发一个简单的Qt应用程序,用于通过TCP进行视频流传输。有一个设备(服务器端)开始监听传入的连接。创建新连接后,服务器开始将图像发送到客户端。另一方面,客户端接收并显示图像。 我已经在Qt,数据流和事务上阅读了很多有关IPC的内容,但是我仍在努力读取传入的数据。我知道TCP将一个长块分成几个数据包,这就是我遇到的问题。

这是我发送..

的代码
void CameraServer::sendData(const QImage &img)
{
    if (mTcpClient->state() == QTcpSocket::ConnectedState) {

        QByteArray imgArray = QByteArray::fromRawData((const char*) img.bits(), img.byteCount());

        // init
        QByteArray data;
        QDataStream outStream(&data, QIODevice::WriteOnly);
        outStream.setDevice(mTcpClient);
        outStream.setVersion(QDataStream::Qt_5_11);

        // serialize
        outStream << imgArray.size();
        outStream << imgArray;

        // send
        mTcpClient.write(data);
        mTcpClient->waitForBytesWritten();
        mTcpClient->flush();

        qDebug() << "Sent" << data.size() << "bytes";
}

..和阅读。

void VCameraClient::readData()
{
    qDebug() << "Received" << mTcpSocket->bytesAvailable() << "bytes";


    if (size == 0) {
        // read the image size
        // toBeRead is a class private member
        inputStream >> toBeRead;
    }

    // read partial data
    // byteArr is a class private member
    if (mTcpSocket->bytesAvailable() < toBeRead) {
        byteArr.append(mTcpSocket->read(mTcpSocket->bytesAvailable()));

        // update the size to be read
        toBeRead -= byteArr.size();
    }

    // read completed
    if (toBeRead <= 0) {
        mframe = QImage((const uchar*) byteArr.data(), 640, 480, QImage::FormatRGB888);
        emit newFrameRead(mFrame);
    }
}

有人可以帮助我吗?如何正确使用QDataStream事务?

0 个答案:

没有答案