Partage
  • Partager sur Facebook
  • Partager sur Twitter

Connexion impossible client serveur QT

    30 mars 2019 à 8:42:56

    Bonjour après plusieurs jour de recherche je n'arrive toujours pas a trouver de solution a mon problèmes, j'ai suivie le cours de Mateo21 sur Qt je suis arrivé au petit cours sur les réseau, mais voila malgré que le client et le serveur fonctionne indépendamment l'un de l'autre il m'est impossible de créé une connexion entre les deux, le client ne trouve pas le serveur et ce en local, si quelqu’un peux m'aider dans mon problèmes je lui en serait reconnaissant, j'aimerais vraiment pouvoir comprendre pourquoi mon code ne fonctionne pas. Je tiens a précisez que le client est le même que le tuto, il a juste était légèrement modifier pour le rendre compatible avec Qt5
    // dossier Main.cpp Serveur
    
    #include "mainwindow.h"
    #include <QApplication>
    #include "data.h"
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
    
        MainWindow fenetre;
        fenetre.show();
    
        return app.exec();
    }
    
    // mainwindow.cpp serveur
    
    #include "mainwindow.h"
    #include "data.h"
    #include "ui_mainwindow.h"
    
    
    MainWindow::MainWindow() : ui(new Ui::MainWindow)
    
    {
        ui->setupUi(this);
        setWindowTitle(tr("Chat - SERVEUR"));
    
    
    
    }
    
    void MainWindow::on_boutonRun_clicked()
    {
         Data donnees;
    
    
         etatServeur = new QLabel;
         etatServeur = donnees.envoieEtatServ();
    
         if(donnees.runServeur())//Lancement Serveur
         {
            ui->console->setText(etatServeur->text());
         }
    
         ui->console->setText(etatServeur->text());
    
    
         clients = donnees.getClients();
    
    
         ui->nbClients->display(clients.size());
    
         ui->boutonRun->hide();
    }
    //Data.cpp Serveur
    
    #include "data.h"
    
    Data::Data()
    {
        etatServeur=new QLabel;
        tailleMessage = 0;
    
    }
    int Data::runServeur()
    {
    
        // Gestion du serveur
        serveur = new QTcpServer(this);//Allumage
    
        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());
            return 1;
        }
        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()));
    
        }
    
    
    }
    
    
    QLabel* Data::envoieEtatServ()
    {
        return etatServeur;
    }
    
    
    
    void Data::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 Data::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 Data::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 Data::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);
        }
    }
    
    QList<QTcpSocket *> Data::getClients()
    {
       return clients;
    }
    
    
    
    //Data.h serveur
    
    #ifndef DATA_H
    #define DATA_H
    
    #include "mainwindow.h"
    
    class Data : public QObject
    {
        Q_OBJECT
    public:
    
        Data();
        int runServeur();
        QLabel* envoieEtatServ(); //envoie l'état du démarrage du serveur
        void envoyerATous(const QString &message);
        QList<QTcpSocket *> getClients();
    
    
    signals:
    
    public slots:
    
        void nouvelleConnexion();
        void donneesRecues();
        void deconnexionClient();
    
    private:
    
    
        QLabel *etatServeur;
        QTcpServer *serveur;
        QList<QTcpSocket *> clients;
        quint16 tailleMessage;
    
    };
    
    #endif // DATA_H
    

    //mainwindow.h serveur
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QtGui>
    #include <QtNetwork>
    #include <QObject>
    #include <QtWidgets>
    #include <QVBoxLayout>
    #include <QPushButton>
    
    
    
    
    namespace Ui { class MainWindow;
    
    }
    
    class MainWindow : public QMainWindow
    {
    
        Q_OBJECT
    
    public:
        MainWindow();
    
    
    
    private slots:
        void on_boutonRun_clicked();
    
    private:
    
        QPushButton *boutonQuitter;
        QLabel *etatServeur;
        QList<QTcpSocket *> clients;
        Ui::MainWindow *ui;
    
    
    };
    
    #endif // MAINWINDOW_H


    -
    Edité par AlexandreFouchonet 30 mars 2019 à 8:44:33

    • Partager sur Facebook
    • Partager sur Twitter
      3 avril 2019 à 17:05:20

      up, j'ai pas abandonnée l'idée de savoir ce qui vas pas, je tiens à préciser que les socket son bon et que les variable rentré aussi

      -
      Edité par AlexandreFouchonet 3 avril 2019 à 17:05:53

      • Partager sur Facebook
      • Partager sur Twitter
        6 avril 2019 à 19:19:03

        Mmh j'ai check très vite mais déjà tu ne devrais pas faire de `new` un peu partout, en cpp, il y a des smart pointers à utiliser.

        Tu as des méthodes qui retourne des int mais sans return.

        if (socket == 0) => if(!socket)

        Montre le code de ton client. Arrives-tu à te connected avec netcat par exemple ou tout autre programme pouvant ouvrir une connexion. Quand tu lances ton serveur, vois-tu ton port ouvert avec `netstat -an` ?

        • Partager sur Facebook
        • Partager sur Twitter

        Connexion impossible client serveur QT

        × 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