IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Envoi d'un message du serveur au client, problème de lecture de fichier texte


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut Envoi d'un message du serveur au client, problème de lecture de fichier texte
    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

  2. #2
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Lorsque tu as un doute sur l'endroit où ça bloque, il n'y a qu'un moyen : tracer le déroulement du programme. Dans ton cas commence par essayer d'afficher les données que tu reçois avec qDebug() pour voir si tu reçois bien ce que tu veux. Si oui, alors le problème vient de ton code d'affichage, si non alors il faut revoir la communication réseau.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut
    Résolu, j'ai décidé de:
    - supprimer les <strong> et les ### de chaque ligne du fichier
    - lire le fichier d'un coup et non ligne par ligne.
    - et ca marche!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création d'un serveur multi client (problème de thread)
    Par Benyou dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 21/08/2013, 01h27
  2. Envoi d'un message à un serveur
    Par maxou483 dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 3
    Dernier message: 22/05/2011, 16h28
  3. VPN serveur Vista, client XP et partage de fichiers
    Par sebaaas dans le forum Windows Vista
    Réponses: 1
    Dernier message: 26/01/2011, 10h19
  4. échange message entre Serveur et client
    Par boukharyinfos dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 19/05/2009, 10h11
  5. Réponses: 4
    Dernier message: 23/11/2008, 02h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo