Я работаю над простым приложением 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?