Как отправить данные с сервера на клиент как 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
    ....
Другие вопросы по тегам