2014-10-01 603 views
1

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

+0

要非常简单,客户端/服务器通信使用的协议,如TCP。这个协议封装你的消息到达你的目的地。消息是字节。字节可以是图像,字符串,文件等,因为一切都是字节。关于quint16的问题,你必须明白,你需要定义你的规则来发送/接收消息,否则你永远不会知道消息何时开始以及何时结束。 – Martin 2014-10-01 17:16:44

+0

那里有任何例子吗?因为这是事实 - 我想了解它 - 但没有一些练习,很难理解。 ...我应该使用哪种尺寸的字符串,哪种尺寸的图片或文本文件...我不知道...有些帮助会很大 – 3ef9g 2014-10-05 13:03:12

+0

您不必担心这些尺寸。请记住tcp comm是一个流式通信。所以你收到0101101010101 ......有时间。您必须定义您的规则(或者使用某些应用程序协议,例如http)来了解消息的开始和结束。假设你想发送一个字符串“hello”。你首先写0x00 0x00知道这是一个消息的开始。然后你打个招呼。然后你写下你的字符串0x05的大小。因此,您可以在您的套接字上发送00 00 68 65 6c 6c 6f 00 05。 – Martin 2014-10-06 08:56:31

回答

2

您不会将数据作为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);

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

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 
    .... 
相关问题