Как отправить данные с сервера на клиент как QByteArray/QDataStream
В образце fortuneserver Qt QString отправляется методом sendFortune()
, Поэтому одна QString выбрана из QStringList fortunes
:
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << fortunes.at(qrand() % fortunes.size());
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
clientConnection->write(block);
Можно ли также отправлять данные другого типа, например, файлы, изображения или несколько строк? Или просто можно отправить одну строку?
Мой второй вопрос: в чем преимущество отправки данных в виде QByteArry и почему я должен определить (quint16)
путем настройки QDataStream?
2 ответа
Вы не отправляете данные как QDataStream, QDataStream - это класс, который олицетворяет поток, способ передачи данных, например проводной. QByteArray представляет хранилище для ваших данных. Таким образом, вы можете отправлять данные как QByteArray. Вы можете попробовать функцию-член QTcpSocket с именем "int write(QByteArray)", как в приведенном вами примере. Просто возьмите изображение, файл, любые другие данные и конвертируйте их в QByteArray. Здесь вам понадобится QDataStream. Привязать поток к bytearray, как это.
QByteArray dat;
QDataStream out(&dat, QIODevice::WriteOnly);
и использовать, чтобы заполнить данные.
out << myImage << myImage2;
Когда вы закончите заполнять QByteArray, отправьте его:
mySocket.write(dat);
не забудьте проверить возвращаемое значение. Прочитайте документы, и у вас все получится.
Чтобы узнать, прочитали ли вы все данные, отправленные другой стороной сокета, я использую commitTransaction()
функция от QDataStream
:
Client::Client()
{
....
connect(tcpSocket, &QIODevice::readyRead, this, &Client::readData);
....
}
void Client::readData()
{
in.startTransaction();
QString data;
in >> data;
if (!in.commitTransaction())
{
qDebug() << TAG << "incomplete: " << data;
// readyRead will be called again when there is more data
return;
}
// data is complete, do something with it
....