Cours:QtTCP : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Reconnexion=)
Ligne 7 : Ligne 7 :
 
</source>
 
</source>
  
=Partie Serveur=
+
=Initialisation=
 +
 
 +
==Partie Serveur==
  
 
Une carte raspberryPi sera utilisée comme serveur.
 
Une carte raspberryPi sera utilisée comme serveur.
Ligne 16 : Ligne 18 :
 
</source>
 
</source>
  
==Mise en place du serveur==
+
===Mise en place du serveur===
  
 
On ajoute un attribut nommé {{Rouge|serveur}} de type QTcpServer à notre application, donc dans le fichier MainWindow.h, et on passe les paramètres au constructeur de la classe QTcpServer dans le fichier MainWindow.cpp
 
On ajoute un attribut nommé {{Rouge|serveur}} de type QTcpServer à notre application, donc dans le fichier MainWindow.h, et on passe les paramètres au constructeur de la classe QTcpServer dans le fichier MainWindow.cpp
Ligne 51 : Ligne 53 :
 
{{Question|afficher un message indiquant la réussite ou l'échec du démarrage du serveur.}}
 
{{Question|afficher un message indiquant la réussite ou l'échec du démarrage du serveur.}}
  
==connexion d'un client==
+
===connexion d'un client===
  
 
Lorsqu'un client se connecte sur votre serveur, celui-ci émet un signal {{Rouge|newConnection}}.
 
Lorsqu'un client se connecte sur votre serveur, celui-ci émet un signal {{Rouge|newConnection}}.
Ligne 59 : Ligne 61 :
 
''Remarque :'' il faudra bien évidemment créer un slot dans la classe MainWindow pour ensuite réaliser la connexion sur le signal émis
 
''Remarque :'' il faudra bien évidemment créer un slot dans la classe MainWindow pour ensuite réaliser la connexion sur le signal émis
  
==Améliorations==
 
  
===Choix du port===
 
{{Todo|Lancer 2 instances de votre programme et constater qu'il n'y en a qu'un seul qui peut créer une connexion}}
 
  
=Partie Client=
+
==Partie Client==
  
==Mise en place du client==
+
===Mise en place du client===
  
 
on ajoute un attribut nommé {{Rouge|client}} de type QTcpSocket à notre application, donc dans le fichier MainWindow.h, et on passe les paramètres au constructeur de la classe QTcpSocket dans le fichier MainWindow.cpp
 
on ajoute un attribut nommé {{Rouge|client}} de type QTcpSocket à notre application, donc dans le fichier MainWindow.h, et on passe les paramètres au constructeur de la classe QTcpSocket dans le fichier MainWindow.cpp
Ligne 95 : Ligne 94 :
  
  
==Connexion sur le serveur==
+
===Connexion sur le serveur===
  
 
Pour se connecter sur un serveur, il suffit d'appeler la méthode {{Rouge|connectToHost}} en spécifiant l'@ du serveur ainsi que le port d'écoute.
 
Pour se connecter sur un serveur, il suffit d'appeler la méthode {{Rouge|connectToHost}} en spécifiant l'@ du serveur ainsi que le port d'écoute.
Ligne 109 : Ligne 108 :
  
  
==Reconnexion==
+
===Reconnexion===
  
 
Pour le moment, dès que l'application serveur est fermée, le client est nécessairement déconnecté, mais il ne relance pas de connexion.
 
Pour le moment, dès que l'application serveur est fermée, le client est nécessairement déconnecté, mais il ne relance pas de connexion.
Ligne 127 : Ligne 126 :
  
 
{{Question|Mettre en place cette partie}}
 
{{Question|Mettre en place cette partie}}
 +
 +
 +
=Echange de données=

Version du 26 novembre 2019 à 11:59

Configuration du projet

Attention, il est nécessaire de rajouter les librairies pour faire du réseau dans le projet :

// ajouter dans le fichier .pro
QT += network

Initialisation

Partie Serveur

Une carte raspberryPi sera utilisée comme serveur.

Vous aurez besoin de l'adresse (notée @ par la suite) ip de votre carte, pour ce faire vous pouvez dans une console lancer la commande :

ping ras-pi-xx

Mise en place du serveur

On ajoute un attribut nommé serveur de type QTcpServer à notre application, donc dans le fichier MainWindow.h, et on passe les paramètres au constructeur de la classe QTcpServer dans le fichier MainWindow.cpp

// mainwindow.h
...
#include <QTcpServer>
...
private :
   QTcpServer serveur;
...


//mainwindow.cpp
...

MainWindow::MainWindow(QWidget *parent)
    :QMainWindow(parent),
     ui(new Ui::MainWindow),
     serveur(this)
{
    ui->setupUi(this);
}
...

Question.jpg En utilisant la méthode listen, dont voici un exemple d'utilisation, faîtes écouter votre serveur sur l'@ ip de votre carte sur le port de votre choix (>1000).

  monServeur.listen(QHostAddress("192.168.0.1"),monNumeroDePort);

Question.jpg afficher un message indiquant la réussite ou l'échec du démarrage du serveur.

connexion d'un client

Lorsqu'un client se connecte sur votre serveur, celui-ci émet un signal newConnection.

Question.jpg Connectez vous sur ce signal pour afficher un message d'information à chaque nouvelle connexion

Remarque : il faudra bien évidemment créer un slot dans la classe MainWindow pour ensuite réaliser la connexion sur le signal émis


Partie Client

Mise en place du client

on ajoute un attribut nommé client de type QTcpSocket à notre application, donc dans le fichier MainWindow.h, et on passe les paramètres au constructeur de la classe QTcpSocket dans le fichier MainWindow.cpp


// mainwindow.h
...
#include <QTcpSocket>
...
private :
   QTcpSocket client;
...


//mainwindow.cpp
...

MainWindow::MainWindow(QWidget *parent)
    :QMainWindow(parent),
     ui(new Ui::MainWindow),
     client(this)
{
    ui->setupUi(this);
}
...


Connexion sur le serveur

Pour se connecter sur un serveur, il suffit d'appeler la méthode connectToHost en spécifiant l'@ du serveur ainsi que le port d'écoute.

monClient.connectToHost("192.168.0.1",monNumeroDePort);

Question.jpg Connectez vous sur votre serveur

Question.jpg Vérifier que votre client s'est bien connecté :

  • le signal connected est émis lorsque la connexion est établie sur le serveur.
  • créer un slot dans votre MainWindow et connecter le signal émis par l'objet client sur ce slot.


Reconnexion

Pour le moment, dès que l'application serveur est fermée, le client est nécessairement déconnecté, mais il ne relance pas de connexion.

Nous allons utiliser un QTimer qui cherchera à rétablir régulièrement cette connexion sur le serveur.

  • Ajouter un attribut de type QTimer dans la classe MainWindow
  • Définir la durée du timer à 100ms (méthode setInterval )
  • le QTimer émettra un signal timeout toutes les 100ms
  • connectez vous sur ce signal un créant un slot "reconnect" dans la classe MainWindow
  • c'est dans ce slot que l'on appelle la méthode connectToHost
  • Pour lancer/arrêter un QTimer, on utilise les méthodes start/stop
  1. Au démarrage de l'application, on lance le QTimer
  2. Lorsqu'on est connecté (signal connnected) on arrête le QTimer
  3. lorsqu'on est déconnecté (signal disconnected) on lance à nouveau le QTimer

Question.jpg Mettre en place cette partie


Echange de données