在Qt的fortuneserver示例中,通过方法sendFortune()
发送QString。如何将数据从服务器发送到客户端作为QByteArray/QDataStream
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);
是否也可以发送其他类型的数据,如文件,图像或多个字符串:所以一个QString的从QStringList中fortunes
选择?或者只是可以发送一个字符串?
我的第二个问题:作为QByteArry发送数据的优点是什么,为什么我必须通过设置QDataStream来定义(quint16)
?
要非常简单,客户端/服务器通信使用的协议,如TCP。这个协议封装你的消息到达你的目的地。消息是字节。字节可以是图像,字符串,文件等,因为一切都是字节。关于quint16的问题,你必须明白,你需要定义你的规则来发送/接收消息,否则你永远不会知道消息何时开始以及何时结束。 – Martin 2014-10-01 17:16:44
那里有任何例子吗?因为这是事实 - 我想了解它 - 但没有一些练习,很难理解。 ...我应该使用哪种尺寸的字符串,哪种尺寸的图片或文本文件...我不知道...有些帮助会很大 – 3ef9g 2014-10-05 13:03:12
您不必担心这些尺寸。请记住tcp comm是一个流式通信。所以你收到0101101010101 ......有时间。您必须定义您的规则(或者使用某些应用程序协议,例如http)来了解消息的开始和结束。假设你想发送一个字符串“hello”。你首先写0x00 0x00知道这是一个消息的开始。然后你打个招呼。然后你写下你的字符串0x05的大小。因此,您可以在您的套接字上发送00 00 68 65 6c 6c 6f 00 05。 – Martin 2014-10-06 08:56:31