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