Bonsoir à tous,
je me décide a poster car cela fait depuis ce matin que je cherche et teste plusieurs solutions sans y parvenir.
Je code actuellement un tchat composé d'une zone où les messages s'affichent, et d'une zone indépendante où je veux que les pseudos des clients connectés s'affichent. Les messages transitent bien et s'affichent correctement, c'est le principal.
Lorsque le client se connecte, seule la zone où il doit saisir son pseudo est "Enabled", le champs de saisie du message est désactivée tant qu'aucun pseudo n'a été saisi et envoyé au serveur via le bouton "Envoyer".
Les pseudos sont stockés sur le serveur dans un fichier .txt sous cette forme:
<strong>pseudo1###
<strong>pseudo2###
<strong>pseudo3###
Je veux que lorsque le client envoie son pseudo, le serveur
- lise le fichier txt ligne par ligne,
- envoie chaque ligne de ce fichier à tous les clients, l'une après l'autre (de cette façon la liste est mise à jour a chaque connexion (je ne gère pas les déconnexions pour le moment, ca viendra après).
Voici le problème:
- lorsque le client clique sur le bouton "Envoyer" pour envoyer son pseudo, la liste des contacts devrait s'afficher, or ce n'est pas le cas, rien ne s'affiche, je conclu donc que le serveur ne lit pas / ou ne renvoie pas la liste.
- lorsque je vais voir dans le fichier .txt en question, le pseudo saisi est bien enregistré!
Voici mon code côté serveur:
FenServeur.cpp
Côté client:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 void FenServeur::donneesRecues() { // 1 : on reçoit un paquet (ou un sous-paquet) d'un des clients // On détermine quel client envoie le message (recherche du QTcpSocket du client) QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender()); if (socket == 0) // Si par hasard on n'a pas trouvé le client à l'origine du signal, on arrête la méthode return; // Si tout va bien, on continue : on récupère le message QDataStream in(socket); if (tailleMessage == 0) // Si on ne connaît pas encore la taille du message, on essaie de la récupérer { if (socket->bytesAvailable() < (int)sizeof(quint16)) // On n'a pas reçu la taille du message en entier return; in >> tailleMessage; // Si on a reçu la taille du message en entier, on la récupère } // Si on connaît la taille du message, on vérifie si on a reçu le message en entier if (socket->bytesAvailable() < tailleMessage) // Si on n'a pas encore tout reçu, on arrête la méthode return; // Si ces lignes s'exécutent, c'est qu'on a reçu tout le message : on peut le récupérer ! QString message; in >> message; if (message.endsWith("###")) // s'il fini par "#", c'est le pseudo, on l'écrit dans le fichier { //Création du fichier de stockage des contacts QFile file("Fichiers//Contacts.txt");// Création d'un objet QFile // On ouvre notre fichier en lecture et écriture et on se place à la fin if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) return; QTextStream flux(&file);// Création d'un objet QTextStream à partir de notre objet QFile flux.setCodec("UTF-8");// On choisit le codec UTF-8 // Écriture du pseudo dans le fichier flux << QString("%1").arg(message) << endl; // ----> jusqu'ici, tout est OK, le fichier se remplit QByteArray data; while(!file.atEnd()) //Tant qu'on est pas a la fin du fichier { data = file.readLine(); //on lit le fichier ligne par ligne // Envoi de la ligne à tous les clients connectés au serveur for (int i = 0; i < clients.size(); i++) { clients[i]->write(data); } } } if (message.endsWith("$$$")) //si le message fini par "$", c'est le message complet (pseudo+ message) { envoyerATous(message); //on envoie à tout le monde } // 3 : remise de la taille du message à 0 pour permettre la réception des futurs messages tailleMessage = 0; }
FenClient.cpp
La je doit avouer que je vois pas le souci, peut-etre est-ce une question d'affichage sur la listePseudo?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 void FenClient::donneesRecues() { /* Même principe que lorsque le serveur reçoit un paquet : On essaie de récupérer la taille du message Une fois qu'on l'a, on attend d'avoir reçu le message entier (en se basant sur la taille annoncée tailleMessage) */ QDataStream in(socket); if (tailleMessage == 0) { if (socket->bytesAvailable() < (int)sizeof(quint16)) return; in >> tailleMessage; } if (socket->bytesAvailable() < tailleMessage) return; // Si on arrive jusqu'à cette ligne, on peut récupérer le message entier QString messageRecu; in >> messageRecu; if (messageRecu.endsWith("###")) //si le paquet fini par "#" c'est seulement le pseudo { messageRecu.remove("###"); //on supprime le caractère # listPseudo->append(messageRecu); //on affiche le paquet dans la liste des pseudos } if (messageRecu.endsWith("$$$")) //si le paquet fini par "$" c'est le pseudo + message { messageRecu.remove("$$$"); //on supprime le caractère $ listeMessages->append(messageRecu); //on affiche le paquet dans la liste des messages } if (messageRecu.endsWith("£££")) //Sinon, ca veut dire qu'on reçoit l'info de connexion ou de déconnexion d'une personne { messageRecu.remove("£££"); listeMessages->append(messageRecu); //On l'affiche donc dans la liste des messages } // On remet la taille du message à 0 pour pouvoir recevoir de futurs messages tailleMessage = 0; }
Merci d'avance!
Tib
Partager