Bonjour,
j'ai développé deux applications en m'aidant d'un exemple présent dans la doc de Qt. La première application est "client app", elle génère toutes les 10s un texte d'information.
La seconde application est "server app": l'application "client app" située sur une machine distante doit s'y connecter et lui envoyer ses informations.
L'application "server app" doit alors afficher dans son IHM le contenu du message.
C'est là qu'est mon problème: tout fonctionne bien au niveau de la connection client/server mais le message ne s'affiche pas côté serveur.
Les deux machines sont sous Windows 10.
Avant de développper mon application "server app", j'ai utilisé le logiciel FileZilla Server, qui lui m'affichait bien le contenu du message.
Le problème vient donc de la partie Server.
Voici le code de "server app":
mainwindow.h
mainwindow.cpp
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 class MainWindow: public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void sessionOpened(); void getNewConnection(); void on_pb_start_clicked(); void displayData(); private: Ui::MainWindow *m_ui; QTcpServer *m_tcpServer = nullptr; QNetworkSession *m_networkSession = nullptr; QTcpSocket *m_clientConnection = nullptr; };
Mon IHM est simple, elle comporte simplement un spinBox "sb_port" pour indiquer sur quel port le serveur doit se mettre en écoute, un bouton "START" nommé "pb_start",
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 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), m_ui(new Ui::MainWindow) { // Init des attributs et de l'IHM m_ui->setupUi(this); m_tcpServer = new QTcpServer(); m_clientConnection = new QTcpSocket(this); // Connections signal/slot connect(m_tcpServer, &QTcpServer::newConnection, this, &MainWindow::getNewConnection); connect(m_clientConnection, &QAbstractSocket::disconnected, m_clientConnection, &QObject::deleteLater); connect(m_clientConnection, &QAbstractSocket::readyRead, this, &MainWindow::displayData); [...] // Init QNetworkSession } MainWindow::~MainWindow() { delete m_ui; delete m_tcpServer; delete m_networkSession; delete m_clientConnection; } void MainWindow::on_pb_start_clicked() { m_ui->txt_infos->setPlainText("Opening network Session"); if(m_networkSession) m_networkSession->open(); else this->sessionOpened(); } void MainWindow::sessionOpened() { [...] // Gestion QNetworkSession // Start the server if(!m_tcpServer->listen(QHostAddress::Any, m_ui->sb_port->value())) { QMessageBox::critical(this, "server app", "Unable to start the server: " + m_tcpServer->errorString()); close(); return; } [...] // Recuperation de la premiere adresse IPV4 dispo dans un QString "ipAddress" m_ui->setPlainText("The server is running on\n\nIP:" + ipAddress + "\nport: " + QString::number(m_tcpServer->serverPort()) + "\n\nRun the client app now"); } void MainWindow::getNewConnection() { m_ui->txt_info->setPlainText("A new connection has been established"); m_clientConnection = m_tcpServer->nextPendingConnection(); } void MainWindow::displayData() { m_ui->txt_info->setPlainText("Retrieving data from client..."); QByteArray data = m_clientConnection->readAll(); m_ui->txt_info->setPlainText(QString(data)); }
et un QTextBrowser nommé "txt_info" dans lequel je veux afficher les données envoyées par le client.
Lorsque je lance tout ça, j'ai bien le message "The server is running [...] run the client app now". Quand j'exécute mon app client sur le bon port, le serveur
indique bien "A new connection has been established" (et je le vois avec un netstat). Par contre, ma fonction "displayData" n'est jamais appelée.
Je pensais pourtant que le fait d'envoyer les données via le client déclencherait le signal "readyRead" auquel cette fonction est connectée.
Je ne comprend donc pas pourquoi cela fonctionne pas, je dois louper quelque chose... Je suis un peu novice en matière de réseau.
Merci d'avance pour votre aide!
Partager