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
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;
}
Côté client:
FenClient.cpp
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;
 
}
La je doit avouer que je vois pas le souci, peut-etre est-ce une question d'affichage sur la listePseudo?

Merci d'avance!

Tib