我知道可能已经提出了一些类似的问题,但我找到的答案涵盖了非常具体的问题,我仍然没有想出来.
在我的程序中,我正在创建一个QObject(称为QPeer),它使用QTcpSocket通过网络与另一个这样的对象进行通信.QPeer有一个插槽,可以接受带有data(sendData(QByteArray))的QByteArray .该数组的全部内容被视为一个"消息",并将它们写入套接字.我想要执行以下操作:每次写入消息时,我都希望接收QPeer只发出dataReceived(QByteArray)一次信号,即包含整个消息的QByteArray.(注意:所有信号/插槽,都是连接QPeer及其插座的私有信号/插槽,以及必要时sendData(QByteArray)使用的序列化的公共信号/插槽Qt::QueuedConnection.)
我使用信号QTcpSocket::readyRead()从套接字异步读取.现在我知道我不能只QTcpSocket::write()在sendData中调用一次,然后假设对于我做的每次写操作,另一端的QTcpSocket只生成一个readyRead信号.所以我该怎么做?
这是我的想法,请告诉我这是否有效:
写作:
void QPeer::sendData(QByteArray data)
{
// TODO: write data.size() as raw int of exactly 4 bytes to socket
const char *bytes = data.constData();
int bytesWritten = 0;
while (bytesWritten < data.size())
bytesWritten += _socket->write(bytes + bytesWritten);
}
Run Code Online (Sandbox Code Playgroud)
读:
现在我希望read函数(连接到QTcpSocket::readyRead())使用头(指定消息长度的4字节int),然后读取该字节数; 接下来用恰好那些字节发出dataReceived.我在尝试这样做时遇到了严重的麻烦.例如:如果发出readyRead怎么办,我可以读取消息的标题,但不是指定的字节数?或者如果仅部分收到标题会怎么样?
1.如何正确地将标头(4字节int)写入套接字?
2.如何正确实现读取功能,使其达到我想要的效果?
欢迎任何提示.谢谢!