Comment utiliser des sockets en C# ? (guide pratique)
Grâce au .NET framework, il est très facile d’implémenter une communication socket client serveur. L’établissement d’une communication nécessite de disposer d’un applicatif serveur et d’au moins un applicatif client. À titre d’exemple, nous allons voir comment créer simplement un mécanisme d’échange de données en se basant sur le langage C# et sur le protocole TCP. Voici comment utiliser les sockets en C#.
/wedata%2F0038171%2F2011-08%2FC-One-Reconfigurable-computer.jpg)
La partie du serveur
Pour créer une communication C# client serveur asynchrone, le .NET Framework fournit les classes "TcpListener" et "TcpClient" dans le NameSpace System.Net.Sockets.
L'initialisation d’un socket c# serveur
- Déclaration de la socket Server (private readonly TcpListener tcpServer).
- Déclaration de la collection de sockets client (private static ArrayList ClientSockets).
- Démarrage du serveur en mode écoute (public InitSocketServe -int port)
tcpServer = new TcpListener(IPAddress.Any, port);
tcpServer.Start();
TcpClient handler = tcpServer.AcceptTcpClient();
int i = ClientSockets.Add(new ClientHandler(handler));
((ClientHandler)ClientSockets[i]).Start().
L’argument Port de InitSocketServer permet de définir le numéro du socket à utiliser (de 1 à 65535). La méthode Start permet d’ouvrir le socket en mode écoute. La méthode AcceptTcpClient permet d’accepter toute connexion entrante. Chaque connexion fournira alors un TcpClient spécifique (avec un processus spécifique). La liste ClientSockets permet de conserver toutes les connexions clients.
La fermeture des connexions
- Il suffit de balayer toutes les entrées du tableau et d’appeler la méthode de fermeture (Stop) foreach (Object Client in ClientSockets) - ( (ClientHandler) Client ).Stop().
- Vous pouvez faire de même pour détecter si un socket a été fermé par le distant en testant la méthode Connected () if (( (ClientHandler) Client ).Connected() == true).
- La fermeture et suppression.
La partie du client
Le client ne doit s’occuper que de sa propre connexion au serveur, ce qui est une tâche beaucoup plus facile à réaliser. Les seuls paramètres à connaître sont l’adresse IP de l’ordinateur serveur et le port sur lequel le serveur est démarré :
- IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(“192.168.1.1”), 5001) - oSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp).
- Réception de données asynchrone (public AsyncCallback CallBack).
- Buffer de réception (byte[] dataBuffer = new byte[1]).
- Connexion - oSocket.Connect(ipEnd).
- If (oSocket.Connected).
- Connecté - if (CallBack == null).
La création d’une réception asynchrone
CallBack = new AsyncCallback(OnDataReceived).
}
- Ecoute en asynchrone (state doit être de type object).
oSocket.BeginReceive(dataBuffer, 0,dataBuffer.Length, SocketFlags.None, CallBack, State).
La réception de données se fera automatiquement dans la méthode OnDataReceived : public void OnDataReceived(IAsyncResult asyn)
La fermeture se fait par la méthode close
- if (oSocket.Connected)
o- Socket.Close();
Le .Net Framework offre de nombreuses fonctionnalités simplifiant la gestion des sockets, aussi bien dans la gestion des connexions/déconnexions que dans l’échange de données par l’intermédiaire de processus séparés (threads) non bloquants.