如何将数据从服务器发送到客户端作为QByteArray/QDataStream
问题描述:
在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)
?
答
您不会将数据作为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
....
要非常简单,客户端/服务器通信使用的协议,如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