LE PROJET
Le projet se composera de deux applications distinctes. Une application serveur qui se mettra en attente d’une connexion et qui l’établira puis recevra des messages du client et une application cliente qui se connectera au serveur et enverra des messages au serveur.
L’application serveur
Voici à quoi ressemblera l’application serveur :
L’application serveur
Cette application est toute simple, elle ne sert qu’à lancer la connexion et afficher les messages. Le code du réseau et des événements seront mis dans une classe séparée de celle de la winform pour une meilleure compréhension.
L’application cliente
Voici à quoi ressemblera l’application cliente :
L’application cliente
Cette application se compose de 2 winforms. Une servant à spécifier le nom du serveur et l’autre servant à envoyer les messages.
Les fonctions asynchrones
Mécanisme des fonctions asynchrones
Les fonctions asynchrones utilisent le principe des Threads pour effectuer les actions de manière non bloquante. En effet quand vous faites appel à une des fonctions BeginFonction de la classe socket, vous lui passez en paramètre une fonction de rappel (callback). Le programme continue son exécution sans attendre la fin de l’E/S sur le socket. Lorsque l’E/S est terminé, un thread system géré par .NET appelle le callback (rappel) passé à l’origine. Tout ce que vous avez à faire est d’implémenter les fonctions de rappels. Cette implémentation se fait grâce aux délégués coté système, par la création d’une instance de la classe AsyncCallback et la création des fonctions de rappel correspondantes coté client. Les fonctions de rappel doivent avoir la signature de AsyncCallback qui possède comme argument un type AsyncResult permettant de retrouver l’objet passé dans les fonctions BeginFonction.
Le serveur
La mise en attente d’une connexion
Pour attendre une connexion il faut utiliser la fonction BeginAccept. Avant de faire appel à BeginAccept, il faut lancer l’écoute sur le port voulu. Cela se fait grâce à la fonction Bind. Cette fonction prend comme argument un objet IPEndPoint. Pour finir le lancement de l’écoute, il faut faire appel à la fonction Listen. Cette fonction est non bloquante.
Attente d’une connexion Me.SocketServer = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Me.SocketServer.Bind(New IPEndPoint(192.168.0.1, 15)) Me.SocketServer.Listen(1)
Je ne reviendrai pas sur le constructeur d’un socket (ceci est développé dans un article sur développez.com ) Le constructeur d’ IPEndPoint prend comme argument une adresse IP et un numéro de port. La fonction Listen prend comme argument le nombre de connexions entrantes que le serveur peut mettre en file d’attente pour acceptation. C’est à dire que si vous passez 1 à Listen et que 3 clients se présentent en même temps, les deux derniers seront automatiquement refusés avant même l’examen de la demande par le socket serveur. Après avoir lancé l’écoute sur le port voulu grâce aux fonctions Bind et Listen il faut lancer l’attente de la connexion grâce à la fonction BeginAccept.
Sub BeginAccept(Dim CallBack As AsyncCallback, Dim obj As object)
Lancement de l’attente asynchrone Me.SocketServer.BeginAccept(AddressOf ConnectionAcceptCallback, Me.SocketServer)
Le deuxième argument sera passé à la fonction connexionCallback, lorsque celle ci sera appelée, à travers la propriété AsyncState de IAsyncResult. Le premier argument est un objet de type AsyncCallback. AsyncCallback est un délégué, qui est le terme en .NET pour désigner un pointeur de fonction. Le constructeur prend comme argument une fonction ayant cette signature :
Sub connexionCallback(Dim asyncResult As IAsyncResult)