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

Réseau Discussion :

Transmission de données entre client et serveur


Sujet :

Réseau

  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut Transmission de données entre client et serveur
    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
    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;
    };
    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
    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));
    }
    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",
    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!

  2. #2
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Bonjour,
    j'ai finalement résolu mon problème:

    - L'initialisation de l'objet QNetworkSession (je n'avais pas mis le code complet dans mon exemple, en passant sur cette partie que je pensais sans problèmes!) ne se faisait pas. En effet j'ai recopié le code proposé dans l'exemple "Fortune Server example", dans lequel le QNetWorkSession ne s'initialise que sur cette condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (manager.capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)
    Finalement j'ai du retirer cette condition (dans laquelle je n'entrait pas) afin d'exécuter le code à chaque fois et initialiser correctement ma session réseau. J'avoue ne pas avoir très bien compris cette partie malgré les explications de l'exemple...

    - J'avais également fait une erreur au moment de récupérer le QTcpSocket lors d'une nouvelle connection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_clientConnection = m_tcpServer->nextPendingConnection();
    Cette ligne écrase le précédent objet dans m_clientConnection, les "connect" réalisés dans le constructeur de ma classe ne sont donc plus appelés... DisplayData n'était donc jamais appelé.
    Il suffisait donc de mettre les connect juste après cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    m_clientConnection = m_tcpServer->nextPendingConnection();
    connect(m_clientConnection, &QAbstractSocket::disconnected, m_clientConnection, &QObject::deleteLater);
    connect(m_clientConnection, &QAbstractSocket::readyRead, this, &MainWindow::displayData);
    et ça fonctionne!

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

Discussions similaires

  1. programme d'échange de données entre client/serveur
    Par g_lahcene dans le forum Réseau
    Réponses: 4
    Dernier message: 04/11/2008, 09h49
  2. transmission des données entre ASP et le serveur
    Par mademoizel dans le forum ASP
    Réponses: 3
    Dernier message: 17/12/2006, 20h11
  3. [C#]Transmission de données entre forms
    Par fafa139 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/05/2006, 18h44
  4. Fin de conversation entre client et serveur
    Par Stany dans le forum C++
    Réponses: 2
    Dernier message: 15/07/2005, 11h07
  5. [Java] Communication entre client et serveur
    Par danje dans le forum CORBA
    Réponses: 1
    Dernier message: 14/12/2004, 18h08

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