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

Réseau Discussion :

Application Qt client/serveur


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut Application Qt client/serveur
    J’aimerai crée une application client/serveur comme ce si, lorsque j’appuie sur le bouton Quitter du serveur la fenêtre du client se ferme

    pour ça j'ai besoin de votre aide pour réalise les signaux /slot et les méthodes

    Fenserveur.ccp

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     #include<QListView>
    #include<QTreeView>
    #include<QDirModel>
    #include<QVBoxLayout>
    #include<QTcpServer>
    #include<QTableView>
    #include "FenServeur.h"
     
    FenServeur::FenServeur()
    {
        // Création et disposition des widgets de la fenêtre
        etatServeur = new QLabel;
        boutonQuitter = new QPushButton(tr("Quitter"));
        connect(boutonQuitter, SIGNAL(clicked()), qApp, SLOT(quit()));
     
        fermeClient = new QPushButton(tr("Ferme Client"));
        connect(fermeClient, SIGNAL(cliked()), this, SLOT(botonFereme()));
     
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(etatServeur);
        layout->addWidget(boutonQuitter);
        layout->addWidget(fermeClient);
        setLayout(layout);
     
        setWindowTitle(tr("ZeroChat - Serveur"));
     
        // Gestion du serveur
        serveur = new QTcpServer(this);
        if (!serveur->listen(QHostAddress::Any, 50885)) // Démarrage du serveur sur toutes les IP disponibles et sur le port 50585
        {
            // Si le serveur n'a pas été démarré correctement
            etatServeur->setText(tr("Le serveur n'a pas pu être démarré. Raison :<br />") + serveur->errorString());
        }
        else
        {
            // Si le serveur a été démarré correctement
            etatServeur->setText(tr("Le serveur a été démarré sur le port <strong>") + QString::number(serveur->serverPort()) + tr("</strong>.<br />Des clients peuvent maintenant se connecter."));
            connect(serveur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
        }
     
        tailleMessage = 0;
    }
     
    void FenServeur::nouvelleConnexion()
    {
        envoyerATous(tr("<em>Un nouveau client vient de se connecter</em>"));
     
        QTcpSocket *nouveauClient = serveur->nextPendingConnection();
        clients << nouveauClient;
     
        connect(nouveauClient, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
        connect(nouveauClient, SIGNAL(disconnected()), this, SLOT(deconnexionClient()));
    }
     
    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;
     
     
        // 2 : on renvoie le message à tous les clients
        envoyerATous(message);
     
        // 3 : remise de la taille du message à 0 pour permettre la réception des futurs messages
        tailleMessage = 0;
    }
     
    void FenServeur::deconnexionClient()
    {
        envoyerATous(tr("<em>Un client vient de se déconnecter</em>"));
     
        // On détermine quel client se déconnecte
        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;
     
        clients.removeOne(socket);
     
        socket->deleteLater();
    }
     
    void FenServeur::envoyerATous(const QString &message)
    {
        // Préparation du paquet
        QByteArray paquet;
        QDataStream out(&paquet, QIODevice::WriteOnly);
     
        out << (quint16) 0; // On écrit 0 au début du paquet pour réserver la place pour écrire la taille
        out << message; // On ajoute le message à la suite
        out.device()->seek(0); // On se replace au début du paquet
        out << (quint16) (paquet.size() - sizeof(quint16)); // On écrase le 0 qu'on avait réservé par la longueur du message
     
     
        // Envoi du paquet préparé à tous les clients connectés au serveur
        for (int i = 0; i < clients.size(); i++)
        {
            clients[i]->write(paquet);
        }
     
    }
     
    void FenServeur::botonFerme()
     
    {   
     
       Je ne sais pas quoi mettre ici !
     
    }
    FenServer.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
    #ifndef FENSERVEUR_H
    #define FENSERVEUR_H
     
     
    #include <QtGui>
    #include <QtNetwork>
    #include<QtWidgets>
    #include<QLabel>
    #include<QPushButton>
     
     
    class FenServeur : public QWidget
    {
        Q_OBJECT
     
        public:
            FenServeur();
            void envoyerATous(const QString &message);
     
        private slots:
            void nouvelleConnexion();
            void donneesRecues();
            void deconnexionClient();
            void botonFerme(); //j'ai ajoute ça
     
        private:
            QLabel *etatServeur;
            QPushButton *boutonQuitter;
            QPushButton *fermeClient; //j'ai ajoute ça
            QTcpServer *serveur;
            QList<QTcpSocket *> clients;
            quint16 tailleMessage;
    };
     
     
    #endif // FENSERVEUR_H
    pour le client j'ai aucune ide

  2. #2
    Membre éclairé
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par défaut
    Bonjour,

    Lorsque le programme serveur s'arrête, tous les clients qui étaient connectés à ce serveur se retrouvent déconnectés. La classe QTcpSocket, que tu dois vraisemblablement utiliser dans ton programme client, possède un signal disconnected() qui est émis dès qu'on déconnecte le socket. Il te suffit donc de connecter ce signal au slot adéquat (par exemple, le slot QCoreApplication::quitApp() ou le slot QWidget::hide()).

    En espérant que ça t'aide.

    Tschüß!

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut VivienD
    Vous pouver me donnez un code comple s'il vous plais

Discussions similaires

  1. Réponses: 13
    Dernier message: 17/01/2024, 16h46
  2. oracle jdeveloper application bdd client serveur
    Par alisonet dans le forum JDeveloper
    Réponses: 1
    Dernier message: 16/01/2008, 16h31
  3. Application type client serveur
    Par juglachant dans le forum Access
    Réponses: 1
    Dernier message: 05/01/2007, 11h02
  4. Application Web Client/Serveur très très simple
    Par n_tony dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 07/03/2006, 14h29
  5. Réponses: 4
    Dernier message: 09/12/2005, 15h48

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