如何将数据以QByteArray/QDataStream的形式从服务器发送到客户端



在Qt的fortuneserver示例中,方法sendFortune()发送一个QString。因此,从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)

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

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

并使用out来填充数据。

out << myImage << myImage2;

当你填写完QByteArray后,发送它:

mySocket.write(dat);

不要忘记检查返回值。阅读文档,你就会成功。

要知道您是否已经读取了套接字另一端发送的所有数据,我使用QDataStream:中的commitTransaction()函数

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
    ....

相关内容

  • 没有找到相关文章

最新更新