Avant-propos

Réaliser une application client serveur devient chose commune et souvent recherchée.

La programmation réseau qu'elle implique est bien souvent compliquée, dans les autres langages, pour des développeurs débutants.

Heureusement, le Framework .Net de Microsoft permet une mise en œuvre simple et efficace.

I. Introduction

I-A. Les Sockets

La programmation réseau repose sur les sockets.

Les sockets sont un mode de communication standard sur réseau, mis au point à Berkeley, qui permettent à une application, de dialoguer avec un protocole. Cela peut être fait sur une même machine, ou bien sur une machine distante, au travers d'un réseau.

Il existe deux modes de communications pour les sockets :

  • le mode connecté, qui utilise le protocole TCP ;
  • le mode déconnecté, qui repose sur le protocole UDP.

I-B. Le Framework .NET

Le Framework .Net dispose de nombreuses classes destinées à faciliter la programmation réseau.

L'ensemble de ces classes est intégré dans les espaces de nom System.Net et System.Net.Sockets.

Ces classes constituent le minimum à utiliser pour le développement d'une application réseau.

II. La classe Socket

La classe Socket du Framework .Net est la base de la programmation réseau.

II-A. Création d'un socket

Pour créer un socket, vous devez l'instancier, au moyen de son constructeur (les paramètres du constructeur sont des énumérations, dépendantes les unes des autres) :

Création d'un socket
Sélectionnez
Socket (AdressFamily famille, SocketType type, ProtocolType protocole)
  1. AdressFamily est le type de l'adresse utilisée : AppleTalk, InterNetwork (IP), InterNetworkV6 (IPv6), etc. ;
  2. SocketType est le type de socket utilisée : Raw, Stream, etc. ;
  3. ProtocolType est le protocole utilisé : Ip, Tcp, Udp, Ipx, etc..

Exemple de création d'un socket :

Exemple de création d'un socket
Sélectionnez
Socket _socket = new Socket (AdressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

II-B. Connexion/Écoute

La connexion à un socket se fait via la méthode Connect de l'objet Socket.

Cette méthode prend en paramètre un IpEndPoint, qui permet de spécifier sur quelle IP et sur quel port notre socket doit se connecter.

Exemple :

Connexion
Sélectionnez
_socket.Connect (new IpEndPoint (Dns.Resolve ("www.developpez.com").AddressList[0], 80));

Il est également possible de créer un socket d'écoute, au moyen de la méthode Listen.

Celle-ci prend en paramètre la taille de la liste d'attente (backlog).

II-C. Transmission des données

Nous allons voir ici comment envoyer et recevoir des données.

II-C-1. Envoi de données

Pour envoyer des données, vous devez utiliser la méthode Send, qui comprend plusieurs surcharges :

Envoi de données
Sélectionnez
Send (Byte [] Message [, indice de départ d'envoi][, Longueur à envoyer][, SocketFlags]);
  • Message est le message à envoyer, sous forme de tableau de byte ;
  • Indice de départ d'envoi est l'indice, dans le tableau, à partir duquel lire ;
  • Longueur à envoyer est le nombre d'octet à envoyer ;
  • SocketFlags est une énumération permettant de contrôler l'envoi des données.

Exemple :

Envoyer des données par les sockets
Sélectionnez
Byte [] Message = System.Text.Encoding.ASCII.GetBytes ("Test envoi de données");
Int OctetsEnvoyes = _socket.Send (Message, 0, Message.Length, SocketFlags.None);

II-C-2. Réception de données

La réception de données, quand à elle, se fait au moyen simple de la méthode Receive.

Tout comme la méthode Send, elle dispose de plusieurs surcharges :

Réception de données
Sélectionnez
Receive (Byte [] MessageRecu [, indice de départ de réception][, Longueur à envoyer][, SocketFlags]);

Les arguments de la méthode Receive sont identiques à ceux de la méthode Send.

Vous pouvez à tout moment contrôler l'état du socket, au moyen de la propriété Connected.

II-D. Fermeture du socket

Pour fermer un socket, vous devez, au préalable, terminer les opérations d'envois et de réceptions sur le socket.

Ensuite, appeler la méthode ShutDown, prenant en paramètre un SocketShutDown.

III. 3. Les classes réseau du Framework .NET

Le Framework .Net contient des classes, toutes dérivées de la classe Socket, qui ont été créées dans le but de simplifier les étapes.

III-A. La classe TcpClient

La classe TcpClient permet d'accéder aux services du protocole TCP.

Il est possible, via cette classe, de se connecter à un socket en écoute, et d'envoyer et recevoir des données de celui-ci.

Pour utiliser cette classe, vous devez :

  • Créer la connexion, au moyen d'un des constructeurs de la classe TcpClient ;
  • Transmettre les données, au moyen d'un objet de type NetworkStream. ;
  • Fermer la connexion, au moyen de la méthode Close de la classe TcpClient.

III-B. La classe UdpClient

La classe UdpClient permet d'accéder aux services du protocole UDP.

Cette classe permet d'envoyer et de recevoir des données.

Utilisation de la classe :

  • Instanciation de la classe, au moyen de l'un des constructeurs disponibles ;
  • Spécification de la destination des messages à envoyer, au moyen de la méthode Connect ;
  • Envoi des données, via la méthode Send ;
  • Réception des données, par la méthode Receive ;
  • Fermeture de la connexion, via la méthode Close de l'objet UdpClient.

III-C. La classe TcpListener

Cette classe est utilisée pour écouter sur des ports TCP.

Utilisation de la classe :

  • Création de l'écoute, au moyen d'un des constructeurs de la classe TcpListener ;
  • Démarrage de l'écoute : Cela se fait par le biais de la méthode Start ;
  • Acceptation des clients : soit en utilisant la méthode AcceptSocket, soit en utilisant la méthode AcceptTcpClient ;
  • Fermeture de la connexion : au moyen de la méthode Close.

Cette liste vous montre les principales méthodes de ces classes : bien sûr, il en existe d'autres, ainsi que des propriétés utiles, que je vous laisse découvrir.

IV. Conclusion

Pour conclure, nous pouvons affirmer que réaliser un logiciel client serveur ne s'avère pas aussi difficile qu'il peut paraître à première vue : en effet, le Framework .Net fournit toutes les classes dont nous avons besoin.

Il ne vous reste plus maintenant qu'à appliquer tout ce que vous venez de voir.