У меня есть класс, определенный мной, скажем, MyClass
. Я хотел бы отправить объект этого класса через QTcpSocket
. В этом ответе предлагается использовать QDataStream
и это показывает, как можно перегрузить операторы <<
и >>
для достижения этой цели.
Пока мне удалось перегрузить операторы <<
и >>
для QDataStream
. Что касается отправки и получения, я следую указаниям из этого ответа от Marek R, который отвечает на вопрос, более или менее дублирующий этот. Мой серверный код, который отправляет объект MyClass
, похоже, работает. Однако я не могу понять, как получить и отформатировать данные из файла QDataStream
.
void SomeClass::slotReadClient() { // slot connected to readyRead signal of QTcpSocket
QTcpSocket *tcpSocket = (QTcpSocket*)sender();
QDataStream clientReadStream(tcpSocket);
while(true) {
if (!next_block_size) {
if (tcpSocket->bytesAvailable() < sizeof(quint16)) { // are size data available
break;
}
clientReadStream >> next_block_size;
}
if (tcpSocket->bytesAvailable() < next_block_size) {
break;
}
QString str;
clientReadStream >> str;
next_block_size = 0;
}
}
Однако, когда я использую это, я получаю сообщение об ошибке:
error: no matching function for call to ‘QDataStream::QDataStream(QTcpSocket*&, QIODevice::OpenModeFlag)’
Исходя из способа отправки, пробовал следующим образом:
MyClass obj;
QByteArray block;
QDataStream rs(&block,QIODevice::ReadWrite);
rs.setVersion(QDataStream::Qt_5_7);
int nextblocksize = 0;
while(true)
{
if(!nextblocksize)
{
if(socket->bytesAvailable() < sizeof(quint16))
{
break;
}
socket->read(block,socket->bytesAvailable());
rs>>nextblocksize;
}
if(socket->bytesAvailable() < nextblocksize)
{
break;
}
socket->read(block,socket->bytesAvailable());
rs>>obj;
nextblocksize=0;
}
Однако это дает следующую ошибку:
error: conversion from ‘QByteArray’ to ‘char*’ is ambiguous
socket->read(block,socket->bytesAvailable());
^
Для справки, ниже приведен код для отправки, который успешно компилируется (не могу проверить, пока не заработает код для чтения):
QTcpSocket *socket = server->nextPendingConnection();
QByteArray block;
MyClass obj(1,2.0, "Hi\n");
QDataStream ds(&block,QIODevice::ReadWrite);
ds.setVersion(QDataStream::Qt_5_7);
ds<<quint16(0)<<obj;
socket->write(block);
Я не очень хорошо знаком с сетевыми концепциями, поэтому я мог упустить что-то тривиальное.
Как мне это сделать?
Кроме того, каково значение quint16(0)
, отправленного в начале блока? Утверждается, что он служит индикатором размера блока, но как он это делает? Разве это не то же самое, независимо от размера блока? Или я совершенно неправильно понял его использование?
Спасибо.