• 20 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Mis à jour le 20/12/2017

TCPListener/TCPClient

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Nous venons de voir les sockets de base. Nous pouvions spécifier le protocole à utiliser, le type de transfert de données, etc. Cependant, pour nous simplifier la vie, d'autres objets ont été créés pour nous permettre de simplifier ces opérations, notamment les opérations de lecture/écriture.

Vous allez découvrir dans ce chapitre deux objets dédiés à la communication réseau : le TCPListener et le TCPClient. L'un servant à écouter, l'autre à se connecter.

TCPListener

Je vais vous présenter l'objet TCPListener. Il est inclus dans le namespace System.Net.Socket également.

Son constructeur est on ne peut plus simple :

Dim MonTcpListener As TcpListener = New TcpListener(IPAddress.Parse("127.0.0.1"), 8080)

Il prend deux arguments : l'adresse IP à laquelle se « binder » (ici la sienne, car il va écouter la connexion arrivant sur la machine où il est exécuté) et le port.
Eh oui, pas de prise de tête avec une configuration X ou Y, juste l'IP et le port.

MonTcpListener.Start()

Et cette méthode lance l'écoute. Voilà, notre serveur est démarré, il est en attente de connexions.

TCPClient

À cet instant, notre listener est en écoute. Puisque le listener est un socket simplifié, vous pouvez parfaitement vous y connecter en utilisant le socket client vu au chapitre précédent. Veillez cependant à bien faire correspondre les options (ici c'est un TCPListener, votre socket doit donc être configuré pour utiliser le protocole TCP).

Bon, sinon, autant rester dans la logique des choses et utiliser un TCP client. Le TCPClient est un objet dérivant également d'un socket, mais simplifié pour pouvoir correspondre avec le TCPListener. Voyons tout de suite sa mise en œuvre.

Pour l'instancier et le connecter :

Dim MonTCPClient As TcpClient = New TcpClient("127.0.0.1", 8080)

Petite particularité qui diffère du TCPListener, ici l'IP en argument est de type String (encore une simplification).

L'acceptation du serveur

Repassons du côté de notre TCPListener pour voir comment effectuer l'acceptation d'un client. Ici, la communication est purement synchrone, cette acceptation sera donc bloquante en attente d'une connexion.

Dim SocketClient As Socket = MonTCPListener.AcceptSocket()

Voilà l'acceptation, identique à celle du chapitre précédent, et cela retourne le socket client qui vient de se connecter (de type socket, attention).
C'est encore une fois cette passerelle que notre serveur va utiliser pour communiquer.

La communication par flux

Ces deux classes TCPListener et TCPClient ne peuvent pas communiquer de la même manière que les sockets classiques (Send/Receive), nous allons devoir instaurer une communication par flux.

Le flux va nous simplifier les opérations de lecture et d'écriture entre sockets. Plus besoin de s’embêter à transmettre des tableaux de Byte, le flux est optimisé pour utiliser des String, et donc du texte.

Pour utiliser les flux, importez System.IO :

Imports System.IO

Analysons son fonctionnement :

Dim MonFlux As NetworkStream = MonSocket.GetStream()
Dim MonReader As StreamReader = New StreamReader(MonFlux)
Dim MonWriter As StreamWriter = New StreamWriter(MonFlux)

Trois lignes pour mettre en place notre flux.
La première crée un flux réseau à partir du socket. L'opération est identique côté client ou serveur. La mise en place d'un flux côté serveur se fera sur un socket venant d'être accepté.
La seconde met en place un flux de lecture à partir du flux réseau.
La troisième met en place le flux d'écriture.

Nous avons donc deux « boîtes » : une dans laquelle on va regarder ce qu'il y a (le reader) pour voir si le client a voulu nous parler ; et une dans laquelle on va écrire ce que l'on veut transmettre au client. Inversement pour le serveur.

Puis, comme pour afficher sur la console, notre envoi et notre réception s'effectueront avec les fonctions ReadLine et WriteLine. On ne peut plus simple !

La lecture
Dim MonMessage As String = MonReader.ReadLine()

Fonction retournant simplement une ligne lue sur le stream. Si vous souhaitez lire tout le stream, utilisez plutôt la fonction Read qui prend cette fois un buffer comme argument, mais je vous le déconseille pour le moment.

L'écriture
MonWriter.WriteLine(Message)
MonWriter.Flush()

Deux étapes pour l'écriture : la première permet d'écrire dans le flux de sortie (writer). On peut donc écrire un String sans problème. Une fois cette ligne exécutée, le message sera encore sur le PC local, pour le transmettre à travers le flux (l'envoyer dans la boîte de lecture de l'autre socket), il faut appeler la méthode Flush. Vous pouvez donc écrire plusieurs lignes et effectuer un Flush seulement une fois toutes les données écrites dans le flux.

La fermeture des flux

Pensez bien à fermer tous vos flux lorsque votre phase de communication est totalement terminée. Dans le cas d'un chat par exemple, cette fermeture ne doit s'effectuer qu'à la déconnexion ou à la fermeture du programme. Dans le cas d'un transfert de fichier, la fermeture doit s'effectuer une fois le transfert terminé.

La méthode Close() est la même pour les trois flux (réseau, écriture et lecture).
Pensez cependant à fermer les flux de lecture et écriture avant le flux réseau. Fermez le socket en dernier si vous n'en avez plus besoin.

  • TCPClient permet de créer un socket simplifié destiné à être client.

  • TCPListener permet de créer un socket simplifié destiné à être serveur.

  • On les utilise pour ensuite créer un flux de communication entre eux. Cela est très utile lors de transferts réguliers.

Exemple de certificat de réussite
Exemple de certificat de réussite