检查是否收到多于或少于一条消息

时间:2017-07-05 15:38:32

标签: qt communication messages data-transfer qtcpsocket

我需要使用QTcpSocket和QTcpServer创建简单的聊天应用程序。我知道我应该在消息的开头放置消息大小来检查消息范围。但是,当应用程序仅接收部分消息或多条消息时,我应该如何处理这些情况呢?

或者可能存在这样的情况:应用程序首先接收不完整的消息,然后接收另一条消息。在这种情况下,两个消息将合并为一个,并且只能识别第二个消息的一部分。

2 个答案:

答案 0 :(得分:1)

你是对的。单读数据可能不完整。 Read this entry。 您可以组成自己的协议以进行正确的数据传输。 我们假设您必须发送短信。你可以用下一个方式做到这一点: 前4个字节 - 消息大小,下一个字节 - 消息。 当您收到第一条数据时,您可以对其进行分析并了解您正在等待的许多字节。当您从第一条消息中读取所有数据时,下一条消息的开头将包含第1个字节的完整消息大小。

答案 1 :(得分:0)

如果您的消息具有已定义的数据类型(或一系列已定义的类型),并且您使用Qt> = 5.7,则可以使用事务。

典型的例子是,如果您的消息是QString(想象一个JSON或XML),您可以像往常一样使用QDataStream来编写它,然后您可以使用它来阅读它:

 QString messageString;
 QDataStream stream(socket);
 stream.startTransaction();
 stream >> messageString;
 if(stream.commitTransaction()){
 // The message was received in full
 }