在Qt的fortuneserver示例中,QString由方法sendFortune()
发送。因此,从QStringList 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发送数据有什么好处?为什么我必须通过设置QDataStream来定义(quint16)
?
答案 0 :(得分:2)
您不会将数据作为QDataStream发送,QDataStream是一个模拟流的类,一种传输数据的方式,如wire。 QByteArray表示数据的存储。 因此,您可以将数据作为QByteArray发送。 您可以尝试QTcpSocket的成员函数“int write(QByteArray)”,就像您提供的示例一样。只需获取图像,文件,任何其他数据并将其转换为QByteArray。这是您需要QDataStream的地方。将流绑定到像这样的bytearray。
QByteArray dat;
QDataStream out(&dat, QIODevice::WriteOnly);
并用来填补数据。
out << myImage << myImage2;
填完QByteArray后,发送:
mySocket.write(dat);
不要忘记检查返回值。 阅读文档,您将获得成功。
答案 1 :(得分: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
....