2017-07-05 95 views
0

我需要使用QTcpSocket和QTcpServer進行簡單的聊天應用程序。我知道我應該在消息的開頭放置消息大小來檢查消息邊界。但是,當應用程序只收到部分消息或多條消息時,我應該如何處理這些情況?檢查收到的信息是否多於或少於一條消息

或者有可能是應用程序在第一次收到不完整的消息,然後收到另一個消息。在這種情況下,兩個消息將被合併到一個並且只有第二個消息的一部分將被識別。

回答

1

你說得對。單讀數據可能不完整。 Read this entry。 您可以制定自己的協議以進行正確的數據傳輸。讓我們假設你必須發送短信。你可以用下面的方法來完成: 前4個字節 - 消息大小,下一個字節 - 消息。 當您收到第一份數據時,您可以分析它並瞭解您正在等待的許多字節。從第一條消息讀取所有數據時,下一條消息的開頭將包含第一個4字節的完整消息大小。

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 
}