2017-07-05 5 views
0

QTcpSocketとQTcpServerを使用して簡単なチャットアプリケーションを作成する必要があります。私は、メッセージの境界をチェックするために、メッセージの先頭にメッセージサイズを入れるべきであることを理解しています。しかし、アプリケーションがメッセージの一部または複数のメッセージだけを受信する場合、どのように処理する必要がありますか?複数のメッセージが受信されたかどうかを確認してください

最初にアプリケーションが不完全なメッセージを受信した後、別のメッセージを受信した場合があります。この状況では、両方のメッセージが1つに統合され、2番目のメッセージの一部のみが認識されます。

答えて

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 
} 
関連する問題