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()")
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 tcpSocket->connectToHost(hostLineEdit->text(), portLineEdit->text().toInt()); tcpSocket->write("Bonjour"); // <--- 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 clientConnection = tcpServer->nextPendingConnection(); connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); connect(clientConnection, SIGNAL(readyRead()), this, SLOT(lecture_donnees())); // <--- mon ajout
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!
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; }
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.
Partager