2017-07-05 8 views
0

Je dois faire une application de chat simple en utilisant QTcpSocket et QTcpServer. Je comprends que je devrais mettre la taille du message au début du message pour vérifier les limites des messages. Mais comment dois-je gérer les cas lorsque l'application ne reçoit qu'une partie du message ou plus d'un message?Vérifie si reçu plus ou moins d'un message

Ou il pourrait y avoir le cas lorsque l'application reçoit d'abord un message incomplet et reçoit ensuite un autre message. Dans cette situation, les deux messages seraient combinés en un et seule une partie du deuxième message serait reconnue.

Répondre

1

Vous avez raison. Les données d'une lecture unique pourraient être incomplètes. Read this entry. Vous pouvez créer votre propre protocole pour un transfert de données correct. Imaginons que vous deviez envoyer un message texte. Vous pouvez le faire de la manière suivante: 4 premiers octets - taille du message, octets suivants - message. Lorsque vous recevez une première donnée, vous pouvez l'analyser et comprendre combien d'octets vous attendez. Lorsque vous lisez toutes les données du premier message, le début du message suivant contiendra la taille complète du message dans les premiers 4 octets.

0

Si vos messages ont un type de données défini (ou une série de types définis) et que vous utilisez Qt> = 5.7, vous pouvez utiliser des transactions.

L'exemple typique est si votre message est un QString (imaginez un JSON ou XML), vous pouvez l'écrire en utilisant QDataStream comme toujours, vous lisez, vous pouvez utiliser:

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