Partage
  • Partager sur Facebook
  • Partager sur Twitter

[TutoQt] Communication via les sockets

Récupérer widget client depuis le serveur

Sujet résolu
    22 mars 2014 à 17:45:18

    Bonjour,

    Je suis en train d'essayer de faire les améliorations du ZeroChat du tuto sur Qt en C++. Je viens de passer du temps sur l'amélioration concernant l'affichage du pseudo lors de la connexion au serveur ("Nico s'est connecté" par exemple). Ce que j'ai fait marche, mais j'ai le sentiment de m'être compliqué la tâche.

    J'ai donc suivi le tuto, un projet pour le serveur (que j'ai nommé QtServeur), un projet pour le client (que j'ai nommé QtClient). Pour le serveur, dans les améliorations, il est demandé de changer son attribut QList<QTcpSocket *> en QList<Client *>, ce que j'ai fait. Voici le code du header de ma classe Client, que j'ai associé à mon projet serveur QtServeur :

    #ifndef CLIENT_H
    #define CLIENT_H
    
    #include <QtWidgets>
    #include <QtNetwork>
    
    class Client : public QWidget
    {
    public:
        explicit Client(QWidget *parent = 0);
        Client(QTcpSocket *tcpSocket);
        void setPseudo(const QString & login);
        QString* getPseudo();
        QString getPseudoString();
        QTcpSocket* getSocket();
    
    private:
        QTcpSocket *socket;
        QString *pseudo;
    };
    
    #endif // CLIENT_H
    

    Actuellement, lorsque je teste et que je me connecte, je fais une vérification pour savoir si un pseudo a bien été saisi, et si c'est le cas, je me connecte au serveur avec la fonction du tuto :

    void QtClient::on_boutonConnexion_clicked(){
        if(pseudo->text().isEmpty()){
            QMessageBox::critical(this,"Pseudo non renseigné", "Veuillez saisir un pseudo.");
            pseudo->setFocus();
            return;
        }
    
        // On annonce sur la fenêtre qu'on est en train de se connecter
        listeMessages->append(tr("<em>Tentative de connexion en cours...</em>"));
        boutonConnexion->setEnabled(false);
        message->setEnabled(false);
        boutonEnvoyer->setEnabled(false);
    
        socket->abort(); // On désactive les conneions précédentes s'il y en a
        socket->connectToHost(serveurIP->text(), serveurPort->value()); // On se connecte au serveur demandé
    }

    Et c'est à ce moment que je commence à avoir du mal... Le message "Un client vient de se connecter" apparaît donc à ce moment là sur le chat pour tous les clients déjà connectés. Je voudrais donc pouvoir envoyer le pseudo du client qui vient de se connecter au serveur pour pouvoir afficher "Nico vient de se connecter". Ce que j'ai fait marche, mais me semble un peu bourrin : dès que le client a confirmation qu'il est connecté, j'envoie un message au serveur contenant la chaine de caractère "pseudo_PSEUDO DU CLIENT" et je fais un test côté serveur pour voir s'il s'agit du pseudo ou d'un message, comme suit :

    QString message;
        in >> message;
    
        if(message.left(7) == "pseudo_"){
            for(int i(0); i < clients.size(); i++){
                if(clients[i]->getSocket() == socket){
                    clients[i]->setPseudo(message.remove("pseudo_"));
                    envoyerATous(tr("<em>") + message.remove("pseudo_") + tr(" vient de se connecter</em>"));
                    break;
                }
            }
        }else{
            // 2 : On renvoie le message à tous les clients
            envoyerATous(message);
        }


    Personnellement, je trouve cette méthode ultra-bourrin, et j'ai le sentiment que je me suis compliqué la vie.

    Donc pour formuler tout ça en question : est-il possible de récupérer le contenu du QLineEdit contenant le pseudo dans l'UI client (QtClient), depuis le socket contenu dans un objet de type Client côté serveur ??

    Ce qui me permettrai de faire quelque chose du style :

    pseudo = clients[i]->getSocket()->pseudo->text();

    où clients est la liste d'objets Client de type QList<Client *>, getSocket() renvoie un pointeur vers le socket du client, et pseudo est le QLineEdit côté clien où l'utilisateur a inscrit son pseudo.

    Voilà, je ne sais pas si j'ai été suffisamment clair, donc n'hésitez pas à me demander plus d'informations si j'en ai oublié.
    Vous pouvez également me conseillé sur une autre façon de procéder pour arriver à mes fins.

    Bref, vous êtes libres de me réponde ce que bon vous semble, étant donné qu'il se peut que certains détails m'aient échappé dans le fonctionnement des sockets, de la communication réseau, des pointeurs, etc... Enfin il y a forcément quelque chose qui m'a échappé mais je n'arrive pas à mettre le doigt dessus.

    Je vous remercie d'avance pour votre aide. 

    -
    Edité par NicoFerrari 22 mars 2014 à 17:48:57

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2019 à 13:35:25

      J'essaie moi aussi de trouver la solution à ce problème mais pour le moment je butte
      • Partager sur Facebook
      • Partager sur Twitter

      [TutoQt] Communication via les sockets

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown