Utilisation des sockets avec le serveur UDP graphique

Cours initiation au développement Qt sur les sockets, tutoriel & guide de travaux pratiques en pdf.

Programme serveur UDP en mode graphique

Dans cette section, on crée une nouvelle application graphique avec l’environnement intégré de développement QtCreator. À partir de l’écran d’accueil, il faut créer un nouveau projet et choisir Application graphique Qt dans la catégorie Projet Qt Widget. Relativement à la section précédente dans laquelle on utilisait un fichier source unique de taille limitée, on se trouve face à un pré découpage des fichiers défini par défaut. Avec cette organisation des sources, la gestion de la fenêtre graphique est séparée du code proprement dit. Tous les attributs de la fenêtre utilisée sont décrits dans le fichier mainwindow.ui.

Utilisation des sockets avec le serveur UDP graphique

Puisque cette section est consacrée à une application graphique, on commence par décrire le volet «interface utilisateur». Une fois le projet ouvert, on sélectionne l’onglet Formulaires puis le fichier de description de la fenêtre graphique mainwindow.ui.
Note Déplacer le pointeur de la souris sur l’image, cliquer sur le bouton droit et lancer «Afficher l’image» pour lire les messages. Dans cette fenêtre, on implante trois objets. pushButton L’objet bouton, dont on a changé le texte affiché, sert à quitter le programme. Le code correspondant à l’utilisation du bouton se trouve dans le fichier mainwindow.cpp. msgLabel Cet objet champ de texte est utilisé pour l’affichage de la chaîne de caractères msg. C’est lors de la réception d’un nouveau message que les caractères de ce champ sont modifiés. 6 http://www.inetdoc.net/dev/socket-qt/qtcreator/nogui-udp-receiver.tar.gz
Initiation au développement Qt sur les sockets
Initiation au développement Qt sur les sockets 7
senderLabel Cet objet champ de texte est utilisé pour l’affichage de l’adresse IP et le numéro de port de l’émetteur du message. Comme dans le cas précédent, il faut qu’un nouveau message ait été reçu et que l’émetteur soit identifié pour que ce champ soit modifié. En revenant au mode Éditer, on peut parcourir les différents fichiers sources du projet.
main.cpp Le programme principal est complété par défaut lors de la création d’un nouveau projet. À notre niveau, il n’est pas nécessaire de le modifier. Son seul travail est d’afficher la fenêtre w de la classe MainWindow avant d’entrer dans la boucle d’évènements (event loop).
mainwindow.h Ce fichier en-tête contient la déclaration de la classe MainWindow. C’est à ce niveau que l’on débute l’édition de code avec l’ajout d’une méthode et de plusieurs membres privés. Le mot clé private spécifie que seuls les objets de la classe ont accès à ces ressources. La méthode processPendingDatagrams() contient tous les traitements de réception, de transformation et de ré émission des messages. Cette méthode utilise les membres déclarés dans la classe. On retrouve ici la liste des variables du programme de la section précédente en plus du pointeur de fenêtre ui (user interface) et des deux champs de texte présentés plus haut. private: Ui::MainWindow *ui; QLabel *senderLabel, *msgLabel; QUdpSocket *listenSocket; QHostAddress senderAddress; quint16 senderPort; QString msg;
mainwindow.cpp Après les déclarations des membres et des méthodes de la classe MainWindow, ce fichier contient le code des méthodes. Les points importants ici sont le traitement des évènements et le traitement des datagrammes réseau.

Traitement des évènements et des datagrammes

Dans ce programme, deux types d’évènements sont scrutés : l’arrivée d’un nouveau datagramme et le clic sur le bouton Quitter. Le code correspondant à la scrutation des évènements est décrit dans la méthode MainWindow du fichier mainwindow.cpp. QObject::connect(listenSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams())); QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close())); L’appel de la méthode connect() de la classe QObject crée une connexion entre le socket listenSocket et le signal issu de la méthode readyRead(). Dès qu’un signal est reçu par la méthode connect(), un datagramme est en attente de lecture. Cette lecture et le traitement associé sont effectués à l’aide du sous-programme processPendingDatagrams() dont le code est donné dans le même fichier source. Ici, l’appel à la méthode connect() de la classe QObject crée une connexion entre l’objet pushButton et le signal issu de la méthode clicked(). Dès que ce signal est reçu, la méthode close() entraîne la fin d’exécution du programme. Pour le traitement des datagrammes, c’est le code du sous-programme processPendingDatagrams() qui assure la lecture, le passage en majuscules des caractères de la chaîne et la réémission. L’opération de transformation des caractères en majuscules n’est qu’une illustration d’un traitement possible. Comme la plupart des protocoles de l’Internet sont basés sur l’échange de messages sous forme de chaînes de caractères, on utilise ici une forme minimaliste de traitement par requête – réponse.
void MainWindow::processPendingDatagrams() {
while (listenSocket->hasPendingDatagrams())
{ QByteArray datagram; datagram.resize(listenSocket->pendingDatagramSize()); listenSocket->readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort); msg = datagram.data(); qDebug() << « Depuis :  » << senderAddress.toString() << ‘:’ << senderPort; qDebug() << Message :  » << msg; ui->senderLabel->setText(tr(« Depuis : %1:%2 »)
. arg(senderAddress.toString()) . arg(senderPort)); ui->msgLabel->setText(tr(« Message : \ »%1\ » ») . arg(msg)); msg = msg.toUpper(); datagram.clear(); datagram.append(msg);
if (listenSocket->writeDatagram(datagram, senderAddress, senderPort) < 0) { qDebug(« Émission du message modifié impossible »); listenSocket->close(); exit(1); } } } On retrouve les éléments du précédent programme en mode console dans le code ci-dessus. La méthode hasPendingDatagrams() renvoie la valeur booléenne vrai tant qu’un datagramme est présent dans la file d’attente. La méthode readDatagram() collecte les données du datagramme ainsi que sa provenance en identifiant l’adresse de l’émetteur et le numéro de port source utilisé. La méthode setText() est appelée pour changer le texte référencé par l’étiquette senderLabel dans la fenêtre MainWindow. On fait apparaître l’adresse IP et le numéro de port de l’émetteur du message. La méthode setText() est à nouveau appelée pour changer le texte référencé par l’étiquette msgLabel dans la fenêtre MainWindow. On fait apparaître ici le contenu de la chaîne de caractères reçue. Une fois la chaîne de caractères transformée, elle est renvoyée à l’émetteur à l’aide de la méthode writeDatagram().

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *