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

Discussion :

Communications dans les deux sens entre QTcpServer et QTcpSocket

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 58
    Points
    58
    Par défaut Communications dans les deux sens entre QTcpServer et QTcpSocket
    Bonjour à tous,

    J'aimerai concevoir deux petites applications en Qt qui communiquent entre elles via des socket. Pour cela, j'ai recopié le code source de l'exemple proposé dans le tutoriel situé sur:

    http://qt.developpez.com/doc/4.5/network-fortuneserver/
    http://qt.developpez.com/doc/4.5/network-fortuneclient/

    L'execution se passe sans problème, et le code est simple à comprendre. Par contre, dans cet exemple, un client se connecte à un serveur. lors de cette connexion, le serveur lui envois une chaine de caracteres tirée aléatoirement. le client lis la chaine envoyé par le serveur et l'affiche. donc en gros, les mécanismes mis en évidences sont:
    - connexion d'un client à un serveur
    - detection d'une nouvelle connexion par le serveur
    - envois de donnée du serveur vers le client
    - lecture de donnée par le client.

    Je souhaiterai enrichir ce code de sorte que le client puisse aussi envoyer des données au serveur, et que ce derniers les lise.

    Pour l'envois du client vers le serveur, j'ai trouvé la méthode: "QTcpSocket::write()"
    Par contre, comment lire du coté serveur, ce que le client à envoyé? un QTcpServeur n'ayant pas de signal "readyRead" comme le "QTcpSoket" pour indiquer que des données sont prete a être lues, ni de "read()" ou de "readAll()" pour lire ce qui arrive.

    J'ai essayé avec la méthode "QTcpServer::nextPendingConnection()" qui renvois un "QTcpSocket", et donc, j'ai connecté le signal "readyRead()" de ce dernier a un slot de lecture que j'ai ajouté au code. Malheureusement, lors de l'execution, le message que j'envois du client vers le serveur n'est pas lu par ce dernier.

    Voici les instructions que j'ai ajouté au code original proposé dans le tutorial dans les liens sont indiqué plus haut:

    Coté Client: (dans la méthode "requestNewFortune()")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tcpSocket->connectToHost(hostLineEdit->text(), portLineEdit->text().toInt());
    tcpSocket->write("Bonjour");     // <--- mon ajout
    et coté Server, j'ai d'abbord mis QTcpSocket *clientConnection dans "Server.h" pour pouvoir y acceder partout dans "Server.cpp", puis dans la méthode "sendFortune()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
    connect(clientConnection, SIGNAL(readyRead()), this, SLOT(lecture_donnees()));  // <--- mon ajout
    et j'ai ajouté la méthode "lecture_données()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Server::lecture(){
    	 QByteArray qba=clientConnection->readAll();
    	 cout << QString(qba).toStdString() << endl;
    }
    L'execution de ce code n'a rien donné de nouveau! c'est a dire que le mot "Bonjour" envoyé par le client au serveur dés la connexion n'a pas été lu par ce dernier!

    Comment faire communiquer un QTcpServer et un QTcpSocket en envoyant et en lisant des données dans les deux sens ?

    Merci pour toute aide qui pourrait me permettre d'avancer.

  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 : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par looclooc Voir le message
    Par contre, comment lire du coté serveur, ce que le client à envoyé? un QTcpServeur n'ayant pas de signal "readyRead" comme le "QTcpSoket" pour indiquer que des données sont prete a être lues, ni de "read()" ou de "readAll()" pour lire ce qui arrive.
    fail. La classe QTcpServer ne sert qu'à prévenir d'une nouvelle connexion et de générer une nouvelle QTcpSocket pour chaque nouvelle connexion.

    Même si son nom peut être source d'erreur, ce n'est pas une socket sur laquelle on peut lire et écrire.

    J'ai essayé avec la méthode "QTcpServer::nextPendingConnection()" qui renvois un "QTcpSocket", et donc, j'ai connecté le signal "readyRead()" de ce dernier a un slot de lecture que j'ai ajouté au code.
    Là, on est bon sur le principe.

    Malheureusement, lors de l'execution, le message que j'envois du client vers le serveur n'est pas lu par ce dernier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tcpSocket->connectToHost(hostLineEdit->text(), portLineEdit->text().toInt());
    tcpSocket->write("Bonjour");     // <--- mon ajout
    Il vaut mieux attendre que la socket soit effectivement connectée (signal 'connected') avant de commencer à balancer du "write".

    Au passage, la méthode write retourne une valeur:
    Returns the number of bytes that were actually written, or -1 if an error occurred.
    Il eut été judicieux de la tester pour s'assurer que le write s'exécutait bien
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 58
    Points
    58
    Par défaut
    Bonjour nouknouk,

    Merci pour ta réponse rapide. j'ai trouvé l'origine du probleme, qui est assez bete il faut le dire, et qui empechait la lecture par le serveur des données envoyés par le client: je n'avais pas enlevé le "clientConnection->disconnectFromHost();" qu'il y avait dans le code original juste après le "write()" pour envoyer au client la chaine de caractere.

    donc il a suffit de ne pas deconnecter le socket pour que la lecture se fasse normalement! sans utiliser le signal "conencted" que tu as suggéré. Mais je dois avouer que ta suggestion est plus "propre" comme travail, donc je l'ai ré-implementé de sorte que l'envois de données ne se fasse qu'une fois le signal "connected" reçu.

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/02/2013, 11h50
  2. Réponses: 0
    Dernier message: 30/06/2010, 16h27
  3. [Oracle 8i] Jointure externe dans les deux sens
    Par Drizzt [Drone38] dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/09/2006, 15h10
  4. Double HashMap (Parcours dans les deux sens)
    Par Graffity dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/02/2006, 11h02
  5. Association navigables dans les deux sens
    Par DarkNagash dans le forum Diagrammes de Classes
    Réponses: 4
    Dernier message: 13/07/2005, 15h11

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