Cours:QtTCP : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(connexion d'un client)
(Connexion sur le serveur)
Ligne 107 : Ligne 107 :
 
*le signal {{Rouge|connected}} est émis lorsque la connexion est établie sur le serveur.
 
*le signal {{Rouge|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.
 
*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
 +
 +
#Au démarrage de l'application, on lance le QTimer
 +
#Lorsqu'on est connecté (signal connnected) on arrête le QTimer
 +
#lorsqu'on est déconnecté (signal disconnected) on lance à nouveau le QTimer
 +
 +
{{Question|Mettre en place cette partie}}

Version du 26 novembre 2019 à 11:54

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

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

Améliorations

Choix du port

Todo.jpg 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

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