我需要使用QTcpSocket和QTcpServer创建简单的聊天应用程序。我知道我应该在消息的开头放置消息大小来检查消息范围。但是,当应用程序仅接收部分消息或多条消息时,我应该如何处理这些情况呢?
或者可能存在这样的情况:应用程序首先接收不完整的消息,然后接收另一条消息。在这种情况下,两个消息将合并为一个,并且只能识别第二个消息的一部分。
答案 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
}