Отправить / получить QImage с QTcpSocket - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над простым приложением Qt для потоковой передачи видео по TCP.Существует устройство (на стороне сервера), которое начинает прослушивать входящие соединения.Когда создается новое соединение, сервер начинает отправлять изображения клиенту.С другой стороны, клиент получает и отображает изображения.Я много читал об IPC на Qt, потоке данных и транзакциях, но я все еще борюсь с чтением входящих данных.Я знаю, что 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?

...