Comment envoyer et recevoir des données TCP/IP à l’aide de sockets en C#
Les sockets sont de plus en plus utilisés aujourd’hui. Ils fournissent un moyen simple d’échanger des données sur le réseau. Il est utilisé, par exemple, pour échanger des messages entre utilisateurs, pour transférer des fichiers, jouer à des jeux « distribués » etc.
Les sockets étant basés sur une architecture client/serveur, l’application est composée d’un serveur et d’un client. Le serveur réservera un numéro de port. Ensuite, il écoutera tout requête cliente éventuelle. Le client tentera alors de se connecter au serveur. Une fois la connexion établie, vous pourrez échanger des messages texte. Lorsque vous avez terminé, la connexion sera fermée.
Socket côté serveur
using System; using System.Net; using System.Net.Sockets; using System.Text; namespace WayToLearnX { public class Server { public static void Main(string[] args) { // Récupérer le nom de l'hôte IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ip = host.AddressList[0]; IPEndPoint endPoint = new IPEndPoint(ip, 9999); // Création du socket TCP/IP Socket listener = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { // Associer une adresse réseau au socket serveur listener.Bind(endPoint); // Liste de clients qui voudront se connecter au serveur listener.Listen(10); while (true) { Console.WriteLine("En attente connexion..."); // accepter la connexion du client Socket client = listener.Accept(); // Data buffer byte[] bytes = new Byte[1024]; string data = null; while (true) { int b = client.Receive(bytes); data += Encoding.ASCII.GetString(bytes, 0, b); if (data.IndexOf("<eof>") > -1) break; } Console.WriteLine("Texte reçu -> {0} ", data); byte[] message = Encoding.ASCII.GetBytes("Welcome to WayToLearnX"); // Envoyer un message au client client.Send(message); client.Shutdown(SocketShutdown.Both); client.Close(); } }catch (Exception e) { Console.WriteLine(e.ToString()); } } } }
Socket côté client
using System; using System.Net; using System.Net.Sockets; using System.Text; namespace WayToLearnX { public class Client { public static void Main(string[] args) { try { // Établir une connexion sur le Port 9999 IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ip = host.AddressList[0]; IPEndPoint endPoint = new IPEndPoint(ip, 9999); // Créer une socket TCP/IP Socket client = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { // Connect Socket client.Connect(endPoint); // le message à envoyer au serveur byte[] msg = Encoding.ASCII.GetBytes("Hello<EOF>"); int byteSent = client.Send(msg); // Data buffer byte[] messageReceived = new byte[1024]; // Recevoir le message int byteRecv = client.Receive(messageReceived); Console.WriteLine("Message du serveur -> {0}", Encoding.ASCII.GetString(messageReceived, 0, byteRecv)); client.Shutdown(SocketShutdown.Both); client.Close(); }catch (SocketException e1) { Console.WriteLine("SocketException : {0}", e1.ToString()); }catch (ArgumentNullException e2) { Console.WriteLine("ArgumentNullException : {0}", e2.ToString()); }catch (Exception e3) { Console.WriteLine("Unexpected exception : {0}", e3.ToString()); } }catch (Exception e) { Console.WriteLine(e.ToString()); } } } }
Exécuter les fichiers sur un terminal ou une invite de commande
Enregistrer les fichiers avec l’extension « .cs ». Exemple : client.cs et server.cs, puis compilez les deux fichiers en exécutant les commandes suivantes:
Compilez le serveur:
> csc server.cs
Compilez le client:
> csc client.cs