我正在开发一个简单的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事务?