3

在 Qt 的 fortuneserver 示例中,方法 发送了一个 QString sendFortune()。因此从 QStringList 中选择一个 QString 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 来定义?

4

2 回答 2

3

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

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

并用 out 来填充 dat。

out << myImage << myImage2;

完成填充 QByteArray 后,发送它:

mySocket.write(dat);

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

于 2015-06-15T18:32:02.243 回答
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
    ....
于 2017-09-11T18:21:56.000 回答