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 :

Dialogue par TCP


Sujet :

Qt

  1. #1
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut Dialogue par TCP
    Bonjour,

    voila je suis en train de mettre une petite appli au point qui dialogue par tcp, mais j'ai un petit soucis qui requiert votre aide :p

    Voila, apparemment la connexion se fait bien, mais le slot connecté à la newConnection() du serveur ne se lance jamais, et je ne sais pas pourquoi...

    voila le code:

    serveur:
    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
     
    class Temperature : public QMainWindow
    {
    	public:
    		Temperature(QWidget* parent =0, Qt::WindowFlags flags =0);
    	private:
    		QTcpServer* serveur;
    		QLabel* labelStatus;
     
    		double tempActuelle;
    		double tempDesiree;
    	private slots:
    		void nouvelleConnexion();
    };
     
    Temperature::Temperature(QWidget* parent, Qt::WindowFlags flags):
    QMainWindow(parent, flags)
    {
    	serveur = new QTcpServer(this);
    	setFixedSize(300,200);
        if (!serveur->listen(QHostAddress::Any, 2156))
        {
            QMessageBox::critical(this, tr("Simulateur Temperature"), tr("Impossible de démarrer le serveur: %1.").arg(serveur->errorString()));
            close();
            return;
        }
     
        labelStatus = new QLabel(tr("Simulation de temperature"), this);
    	statusBar()->addWidget(labelStatus, 1);
        QMessageBox::information(this, tr("Simulateur Temperature"), tr("Serveur démarré"));
        QString str;
        labelStatus->setText(tr("Serveur démarré sur le port : ")+str.setNum(serveur->serverPort()));
     
    	connect(serveur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
     
     
    }
     
    void Temperature::nouvelleConnexion()
    {
    	QMessageBox::information(this, tr("Simulateur Temperature"), tr("Nouvelle connexion"));
     
    	QTcpSocket* clientConnection = serveur->nextPendingConnection();
    	connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
     
    	QByteArray block;
    	QDataStream sflux(&block, QIODevice::WriteOnly);
    	//envoie temperature actuelle, temperature désirée
    	sflux << tempActuelle << "," << tempDesiree;
     
    	clientConnection->write(block);
     
    	//a enlever après
    	clientConnection->disconnectFromHost();
     
    }
    et pour le client:
    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
     
    Temperature::Temperature(quint16 _port, QWidget* parent, QHostAddress _adresse):
    Module(_port, parent, _adresse)
    {
        connect(&socket, SIGNAL(readyRead()), this, SLOT(reception()));
    }
     
    void Temperature::demanderUpdate()
    {
    	QString str;
    	QMessageBox::information(widget, "Info", "Demande de connection au serveur sur le port "+str.setNum(port));
    	socket.connectToHost(adresse, port);
     
    }
     
    void Temperature::afficherErreur(QAbstractSocket::SocketError)
    {
    	QMessageBox::information(widget, "Erreur", "Erreur de connexion: \n "+socket.errorString());
     
    }
     
    void Temperature::reception()
    {
    	QDataStream in(&socket);
     
    	QString reponse;
    	in >> reponse;
     
    	QMessageBox::information(widget, "Reponse du serveur", "Reponse:  \n  "+reponse);
     
    }
    Or quand je lance tout ça (la demande d'update est lancée par un QPushButton), à parament le client se connecte au serveur (si je coupe le serveur, le client m'indique en erreur que le serveur s'est déconnecté), mais le slot nouvelleConnexion() n'est apparemment jamais lancé.

    Si quelqu'un a une piste, je l'en remercie d'avance...

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    salut,

    Citation Envoyé par haraelendil Voir le message
    le slot nouvelleConnexion() n'est apparemment jamais lancé.
    Peux-tu nous en dire plus ? est-ce que ta conclusion est basée sur le fait que le client ne reçoit rien ? ou bien parce que tu as ajouté un qDebug au début de nouvelleConnexion() et qu'il n'affiche rien ? ou autre ?

    Si c'est le premier cas (client ne reçoit rien):

    1/ ajoute des qDebug (ou utilise les points d'arrêt de ton IDE préféré) un peu partout. Tu pourra comme ça être certain que c'est bien le slot qui n'est pas appelé et que ça ne vient pas d'ailleurs.

    2/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    clientConnection->write(block);
    clientConnection->disconnectFromHost();
    Ce code me semble un peu abrupt: un write sur une socket utilise des buffers. Donc la socket est plutôt du genre à écrire effectivement sur la socket quand le programme repasse par la boucle d'événements (cf. lien ci-dessous). Or ta déconnexion est demandée avant, et elle est faite immédiatement.

    L'idée serait de forcer à écrire les données avant de déconnecter. Un appel à la fonction QAbstractSocket::flush() après le write() et avant le disconnect(). Pour faire un test simple et rapide, tu peux aussi mettre commentaires la ligne de déconnexion pour voir si le souci vient de là.

Discussions similaires

  1. Connexion par TCP/IP impossible sur une deuxième instance
    Par sdelaunay dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 25/08/2006, 23h24
  2. fermer boite de dialogue par la croix
    Par mm2405 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 25/04/2006, 14h40
  3. [Réseau][Débutant]Application Serveur/Client par TCP/IP
    Par Belegkarnil dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 13/11/2005, 14h39
  4. Delphi Connexion à une base de donnée distante par TCP/IP
    Par viecel dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/01/2005, 20h19
  5. problème de connection mysql par tcp/ip
    Par leroyphil dans le forum Administration
    Réponses: 5
    Dernier message: 04/09/2003, 19h27

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