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

问题描述:

我需要使用QTcpSocket和QTcpServer进行简单的聊天应用程序。我知道我应该在消息的开头放置消息大小来检查消息边界。但是,当应用程序只收到部分消息或多条消息时,我应该如何处理这些情况?检查收到的信息是否多于或少于一条消息

或者有可能是应用程序在第一次收到不完整的消息,然后收到另一个消息。在这种情况下,两个消息将被合并到一个并且只有第二个消息的一部分将被识别。

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

如果您的消息具有定义的数据类型(或一系列定义的类型)并且您使用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 
}