Имеется клиент-серверное приложение, взаимодействующее через QTcpSocket.
С сервера QJsonObject передается следующим образом:
void TransceiverProvider::sendMessage(const QJsonObject &jsonObject)
{
QByteArray data = QJsonDocument(jsonObject).toBinaryData();
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_2);
out << (quint16)0;
out << data;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
qDebug() << "Data size:" << data.size();
qDebug() << "Block size:" << block.size() - sizeof(quint16);
qDebug() << "Data:" << data.toHex();
qDebug() << "Block:" << block.toHex();
m_tcpSocket->write(block);
}
Во время выполнения выводится следующее:
Data size: 76
Block size: 80
Data: "71626a73010000004400000003000000400000009b0300000700636f6d6d616e6400000022006765745f73796e635f706172616d65746572732021212121212121212121212121210c000000"
Block: "00500000004c71626a73010000004400000003000000400000009b0300000700636f6d6d616e6400000022006765745f73796e635f706172616d65746572732021212121212121212121212121210c000000"
Клиент принимает сообщение таким образом:
void TransceiverProvider::readyRead()
{
QDataStream in(m_tcpSocket);
in.setVersion(QDataStream::Qt_4_2);
for (;;)
{
if (m_blockSize == 0)
{
if (m_tcpSocket->bytesAvailable() < (int)sizeof(quint16))
{
return;
}
in >> m_blockSize;
}
if (m_tcpSocket->bytesAvailable() < m_blockSize)
{
return;
}
char * buf = new char[m_blockSize];
in.readRawData(buf, m_blockSize);
QByteArray data(buf, m_blockSize);
delete buf;
qDebug() << "block size:" << m_blockSize;
qDebug() << "size:" << data.size();
qDebug() << "data:" << data.toHex();
emit receivedMessage(QJsonDocument::fromBinaryData(data).object());
m_blockSize = 0;
}
}
Вывод:
block size: 80
size: 80
data: "0000004c71626a73010000004400000003000000400000009b0300000700636f6d6d616e6400000022006765745f73796e635f706172616d65746572732021212121212121212121212121210c000000"
Естественно построить исходный json объект не удается. Как видно data на клиенте не равна data на сервере. А захватывает часть исходного сообщения (block).
Чем это вызвано?