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 :

[Réseau] pb socket Qt et affichage ds label


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut [Réseau] pb socket Qt et affichage ds label
    Bonjour à tous

    j'ai un petit probleme avec mon programme reseau:

    main.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
    72
    #define HE
    #include <QApplication>
    #include <QFont>
    #include <QPushButton>
    #include <QLabel>
    #include <QTextEdit>
    #include <QtNetwork\QTcpServer>
    #include <QtCore\QObject>
    #include <QtCore\QString>
    #include <QTcpServer>
    #include <QTcpSocket>
    #include <QSound>
    #include "link.h"
     
    using namespace std;
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        QWidget fenetrep; /**objet parent*/
     
        /**Server et client*/
        QTcpServer serveur;
        QTcpSocket client;
        serveur.listen(QHostAddress::Any,8282);
        /**end*/
     
        /**creation of objects link to the parent */
        QPushButton BoutonSeb("Seb",&fenetrep);
        QPushButton BoutonJer("Jer",&fenetrep);
        QPushButton BoutonThi("Thi",&fenetrep);
        QPushButton BoutonEnvoyer("Envoyer",&fenetrep);
        QPushButton BoutonQuitter("Quitter",&fenetrep);
        QLabel LabelConnection("Label d'info--Programme développé par Seb",&fenetrep);
        QLabel LabelReceive("Label de reception",&fenetrep);
        QTextEdit TextZone(&fenetrep);
        link tra(&TextZone,&LabelConnection,&serveur,&client);
        QSound son("ringin.wav",&fenetrep);
        /**end */
     
        /**Resize*/
        fenetrep.resize(800,600);
        BoutonJer.setGeometry(10, 10,50,30);
        BoutonSeb.setGeometry(375, 10,50,30);
        BoutonThi.setGeometry(740, 10,50,30);
        BoutonEnvoyer.setGeometry(370, 500,75,45);
        BoutonQuitter.setGeometry(370,550,75,45);
        LabelConnection.setGeometry(10,30,775,45);
        LabelReceive.setGeometry(10,60,775,300);
        TextZone.setGeometry(10,450,775,45);
        /**end*/
     
     
     
        /**event*/
            QObject::connect(&BoutonQuitter,SIGNAL(clicked()),&app,SLOT(quit()));
            QObject::connect(&BoutonEnvoyer,SIGNAL(clicked()),&tra,SLOT(appaff()));
            QObject::connect(&BoutonSeb,SIGNAL(clicked()),&tra,SLOT(connectionToSeb()));
            QObject::connect(&BoutonJer,SIGNAL(clicked()),&tra,SLOT(connectionToJer()));
            QObject::connect(&BoutonThi,SIGNAL(clicked()),&tra,SLOT(connectionToThi()));
            QObject::connect(&serveur,SIGNAL(newConnection()),&son,SLOT(play()));
            QObject::connect(&serveur,SIGNAL(newConnection()),&tra,SLOT(acceptClient()));
            QObject::connect(&client,SIGNAL(connected()),&tra,SLOT(CEst()));
            QObject::connect(&client,SIGNAL(readyRead()),&tra,SLOT(lecture()));
     
    QObject::connect(&BoutonEnvoyer,SIGNAL(clicked()),&tra,SLOT(envoie()));
        /**end*/
     
     
        fenetrep.show();
     
        return app.exec();
    }
    link.h
    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
    #ifndef HE
    #include <QLabel>
    #include <QTextEdit>
    #include <QtCore\QObject>
    #include <QTcpServer>
    #include <QTcpSocket>
    #include <QSound>
    #include <QTextStream>
    #endif
     
    using namespace std;
    class link : public QObject
    {
        Q_OBJECT
     
     
        public:
        link(QTextEdit *T, QLabel *L,QTcpServer *S,QTcpSocket *C ) : Text(T),Label(L),Serveur(S),Client(C)
         {
         };
     
        void affichage();
     
     
     
     
     
     
        public slots:
        void appaff();
        void connectionToJer();
        void connectionToSeb();
        void connectionToThi();
        void acceptClient();
        void CEst();
        void lecture();
        void envoie();
     
     
     
     
        private:
        QTextEdit *Text;
        QLabel *Label;
        QTcpServer *Serveur;
        QTcpSocket *Client;
     
    };
    link.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
    #include "link.h"
     
    void link::appaff()
    {
        affichage();
    }
     
     
    void link::affichage()
    {
        Label->setText(Text->toPlainText());
    }
     
    void link::connectionToJer()
    {
     
        Client->connectToHost("192.168.1.251",8282);
    }
     
    void link::connectionToSeb()
    {
     
        Client->connectToHost("192.168.1.254",8282);
     
    }
     
    void link::connectionToThi()
    {
     
        Client->connectToHost("192.168.1.252",8282);
    }
     
    void link::acceptClient()
    {
        Serveur->close();
        Client=Serveur->nextPendingConnection();
    }
     
    void link::CEst()
    {
    QSound son0("chimes.wav");
        son0.play("chimes.wav");
     
    }
     
    void link::lecture()
    {
    while(Client->canReadLine())
    {
    Label->setText(Client->readLine());
    }
    }
     
    void link::envoie()
    {
    QTextStream objet(Client);
    QString chaine(Text->toPlainText());
    objet<<chaine<<endl;
    }
    Lorsque que j'appuis sur un des boutons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QPushButton BoutonSeb("Seb",&fenetrep);
        QPushButton BoutonJer("Jer",&fenetrep);
        QPushButton BoutonThi("Thi",&fenetrep);
    la connection doit se faire. Jusqu'a là aucun probleme la connection se fait tres bien.

    Lorque l'on tape un texte dans , et que l'on appuit sur envoyer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPushButton BoutonEnvoyer
    , le texte doit etre afficher dans le label sur le poste qui envoit le message, puis doit etres envoyer sur le poste destinateur et afficher danc ce meme lablel.

    Le probleme ici c'est que le texte n'est pas afficher sur le label du poste destinataire.

    pouvez vous m'aidez pour ce probleme?

    merci d'avance

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    salut.
    Si tu fait cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void link::envoie()
    {
    QTextStream objet(Serveur);
    QString chaine(Text->toPlainText());
    objet<<chaine<<endl;
    }
    Ca donne quoi??

  3. #3
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Euh...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void link::acceptClient()
    {
        Serveur->close();
        Client=Serveur->nextPendingConnection();
    }
    Tu peux expliquer pourquoi tu fermes le serveur dès lors qu'une connection est demandée?!

    Bon, franchement, commence par faire les tutos de la doc, ensuite, tu pourras regarder les exemples network fournis avec Qt. Oublie le réseau le temps de te familiariser avec Qt dans un premier temps. On code pas une GUI utilisant du réseau comme on code en console (et encore). Là le ratio remarques à faire/fonctions est trop élévée... Et y'a plus urgent à régler que ce petit problème de communication.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    merci pour vos réponses.

    Pour le moment je ne peut pas faire ce que tu dit Mongaulois tous simplement parce que je ne suis pas sur mon PC. Je te tiendra au courant cette apres-midi.

    IrmatDen, la fonction close() permet,d'apres la doc,d'arreter l'ecoute par le serveur.
    puisque je veut qu'il y est qu'connection à la fois,A quoi ça sert de garder le serveur en ecoute quand un client se connecte?Pour moi à rien. Voila pourquoi j'arrete l'ecoute par le serveur grace à la fonction close.
    Calling close() makes QTcpServer stop listening for incoming connections.

  5. #5
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Toute communication implique l'existence de socket client *et* serveur. Ca peut être la même machine, mais tu n'as pas le choix. Donc couper le serveur coupe la comm, c'est pas plus compliqué que ça.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    Non je ne pense pas. Pour moi ça arrete tous simplement l'ecoute et non la connection:
    D'ailleur apres avoir mis le close(), le client envoie le signal connected() confirmé par la lecture du son chimes.wav

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QObject::connect(&serveur,SIGNAL(newConnection()),&tra,SLOT(acceptClient()));
            QObject::connect(&client,SIGNAL(connected()),&tra,SLOT(CEst()));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void link::CEst()
    {
    QSound son0("chimes.wav");
        son0.play("chimes.wav");
     
    }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    salut.
    Si tu fait cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void link::envoie()
    {
    QTextStream objet(Serveur);
    QString chaine(Text->toPlainText());
    objet<<chaine<<endl;
    }
    Ca donne quoi??
    ça donne rien à part un code d'erreur:

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Le QTextStream utilise un socket comme argument, et non un serveur. Mais je suppose qu'il est possible de récupérer un socket depuis le serveur.

    Un truc de ce genre là pourrait marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTextStream monStream(monQTcpServer.nextPendingConnection());
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Ok je ne connait pas trop cette partie de Qt.
    Mais regarde cette example et je pense que irmaden as raison
    http://qt.developpez.com/doc/latest/...uneserver.html

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    Gulish, ta proposition ne genere pas de bug ce qui semble logique puisque cela revient en faite à mettre directement le socket
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTextStream objet(Client);
    cela ne resoud donc pas le probleme

    Mongaulois, je reste persuadé que irmaden n'a pas raison mais puisque je peut me tromper j'ai essayer de supprimer le close() mais cela ne change rien a part q'il n'arrete pas l'ecoute(je le sais par netstat -a)

  11. #11
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Nan, mais y'a pas que ça de casser de casser dans ton code. Commence par apprendre les bases de Qt, et faire une séparation propre (ne serait-ce qu'à peu près) des composants et responsabilités.
    Donc fais les tutos de bases qui te permettront d'apprendre à utiliser Qt. Ensuite, tu enchaînes sur l'analyse des exemples de la section networking, plus précisément les fortune server et client comme l'a indiqué Mongaulois. Et seulement à ce moment là tu commenceras à avoir une meilleure vision de comment réaliser ce que tu veux.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Nan, mais y'a pas que ça de casser de casser dans ton code. Commence par apprendre les bases de Qt, et faire une séparation propre (ne serait-ce qu'à peu près) des composants et responsabilités.
    Donc fais les tutos de bases qui te permettront d'apprendre à utiliser Qt. Ensuite, tu enchaînes sur l'analyse des exemples de la section networking, plus précisément les fortune server et client comme l'a indiqué Mongaulois. Et seulement à ce moment là tu commenceras à avoir une meilleure vision de comment réaliser ce que tu veux.
    euh je ne vois pas ce qu'il y a de "casser" dans mon code...
    J'ai deja fait des tuto et des recherche pour ce bug si je poste ici c'est pas parce que j'ai la fleme de chercher ou de faire des tuto.
    D'ailleur c'est sur les tuto où j'ai apris que la fonction close() ne pouvait pas etre à l'origine de mon probleme parce que son seul but est d'areter l'ecoute et non de fermer la connection.D'ailleur avec la fonction close(), netstat -a m'affiche bien ESTABLISHED

    Et puisque tu semble bien connaitre Qt pourquoi ne me dit tu pas tout simplement où est le (ou les,selon toi)problemes de mon code?

  13. #13
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    J'ai deja fait des tuto et des recherche pour ce bug si je poste ici c'est pas parce que j'ai la fleme de chercher ou de faire des tuto.
    Attention, je n'ai pas dit que tu avais la flemme Juste qu'il y a un gros manque de connaissance en conception, en GUI et en réseau. Et qu'il est préférable de combler un manque à la fois.

    Citation Envoyé par sebatlante Voir le message
    Et puisque tu semble bien connaitre Qt pourquoi ne me dit tu pas tout simplement où est le (ou les,selon toi)problemes de mon code?
    * tout et n'importe quoi dans le main
    * instanciation de socket client alors qu'il n'y a pas lieu
    * la classe link devrait être coupée en (strict) minimum 4 classes (client, serveur, parseur, interaction gui au minimum)
    * il manque la classe GUI
    * tu ne comprends pas le message d'erreur généré par la petite modif de mongaulois (passage par pointeur, par référence...)
    * peu ou pas d'indentations
    * instanciation sur la pile à gogo d'objets complexes et lourd.
    * utilisation de setGeometry au lieu des layout

    Le résultat est qu'il est illisible et dur à débugger. C'est vraiment pour ça que je te conseille de faire des tutos, parce que ce code dénote de grosses incompréhensions à tout les niveau: C++, conception, gui (et Qt par la même) et réseau. Ce n'est absolument pas pour te vexer, crois moi.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    je vais suivre tes conseil dans ce cas.
    merci

  15. #15
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Je vais essayer de préciser pourquoi ça ne marche pas en dehors des autres problèmes évoqués plus haut.

    On va prendre le cas de deux programmes qui veulent s'envoyer des messages, A et B.
    On a A, qui instancie un objet link, et lui passe l'adresse d'un socket, stockée dans Client. Idem pour B.
    Lorsque A veut se connecter à B, il appelle Client->connectToHost(), tout va bien.
    B reçoit la connexion et acceptClient() est appelée. Sauf qu'on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client=Serveur->nextPendingConnection();
    Et là, on met dans Client le socket de la nouvelle connexion, et on oublie celle du premier socket, celui où il y a toutes les connexions de slots.
    On se retrouve avec un socket perdu dans la nature, qui est bien connecté à toutes les fonctions, et un lié à la connexion entre A et B, qui ne fait rien quand il reçoit des messages.

Discussions similaires

  1. [VBA-E] Boucle d affichage pour label
    Par mick_ban dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/03/2007, 16h11
  2. {Réseau} raw socket recherche de doc
    Par Creuvard dans le forum Réseau
    Réponses: 10
    Dernier message: 31/08/2006, 19h42
  3. probleme d'affichage de label
    Par shub dans le forum IHM
    Réponses: 5
    Dernier message: 11/05/2006, 10h54
  4. [Réseau] Problème socket
    Par neenee dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 18/01/2005, 15h26
  5. [Réseau] Programmation socket
    Par raj dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 03/12/2004, 12h58

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