如何将数据从服务器发送到客户端作为QByteArray / QDataStream

时间:2014-10-01 16:51:02

标签: qt qtcpsocket qbytearray qtcpserver qdatastream

在Qt的fortuneserver示例中,QString由方法sendFortune()发送。因此,从QStringList fortunes

中选择一个QString
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发送数据有什么好处?为什么我必须通过设置QDataStream来定义(quint16)

2 个答案:

答案 0 :(得分:2)

您不会将数据作为QDataStream发送,QDataStream是一个模拟流的类,一种传输数据的方式,如wire。 QByteArray表示数据的存储。 因此,您可以将数据作为QByteArray发送。 您可以尝试QTcpSocket的成员函数“int write(QByteArray)”,就像您提供的示例一样。只需获取图像,文件,任何其他数据并将其转换为QByteArray。这是您需要QDataStream的地方。将流绑定到像这样的bytearray。

QByteArray dat; QDataStream out(&dat, QIODevice::WriteOnly);

并用来填补数据。

out << myImage << myImage2;

填完QByteArray后,发送:

mySocket.write(dat);

不要忘记检查返回值。 阅读文档,您将获得成功。

答案 1 :(得分:0)

要知道您是否已阅读套接字另一方发送的所有数据,我使用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
    ....