Configurer la communication client-serveur en C#

Muhammad Husnain 15 février 2024
  1. Protocole de contrôle de transmission (TCP)
  2. Configurer la communication client-serveur en C#
Configurer la communication client-serveur en C#

Ce didacticiel de programmation trivial abordera la transmission de données dans un environnement client-serveur. Il fournira également une implémentation basée sur C# au modèle de communication client-serveur via la programmation de socket TCP.

Protocole de contrôle de transmission (TCP)

L’Open Systems Interconnection (OSI) est un modèle de référence communicationnel largement adopté qui explique comment les ordinateurs peuvent communiquer entre eux. Il garantit que des données sans erreur sont transmises d’un bout à l’autre.

Le modèle OSI en couches définit certaines règles et protocoles à suivre lors de l’envoi ou de la réception des données. Toutes les couches fonctionnent individuellement et accomplissent leurs tâches en transmettant des données d’un bout à l’autre.

Cet article explique uniquement la couche Transport. Le principal protocole utilisé à cette couche est le protocole de contrôle de transmission (TCP) et a les principales responsabilités suivantes :

  1. Établissez une connexion entre deux extrémités, puis détruisez cette connexion lorsque la communication est terminée.
  2. Transfert de données qui comprend les tâches suivantes :
    • Assure la fiabilité des données et vérifie si les données sont transférées dans un ordre séquentiel et sans erreur.
    • Détecter l’erreur, le cas échéant, et renvoyer les paquets perdus.
    • Contrôler le flux et le débit des paquets de données.
  3. Accusé de réception et définition des drapeaux.

Configurer la communication client-serveur en C#

Passons à l’implémentation de l’application client/serveur dans le framework .NET en utilisant le langage C#. Nous effectuerons cette implémentation à l’aide de Visual Studio Enterprise Edition 2019.

Nous allons créer deux applications, une pour le côté client et une pour le côté serveur. Pour les tests, ces deux applications résideront sur le même ordinateur.

Dans un premier temps, nous allons créer une application client. Pour cela, ouvrez Visual Studio et créez un nouveau projet.

Ensuite, sélectionnez le type de projet Console Application et cliquez sur Next.

Sélectionnez l’application console

Mettez le nom du projet en tant que Client Application et le nom de la solution en tant que ClientServerApplication. Cela va créer un nouveau projet pour le côté client.

Définir le nom du projet côté client et le nom de la solution

Pour la programmation côté serveur, créez un autre projet dans la même solution :

Définir le nom du projet côté serveur et le nom de la solution

Ce projet sera nommé ServerApplication et dans la même solution.

Après avoir créé les projets, vous devez ajouter les fichiers du package Network Comms Dot Net. Pour cela, vous devez les installer à l’aide de la console NuGet.

Allez dans Tools > NuGet Package Manager > Package Manager Console comme ceci dans l’image :

Ajouter des fichiers de package

Vous obtiendrez la console du gestionnaire de packages dans la fenêtre, comme indiqué dans l’image ci-dessus. Dans cette console, nous écrirons la commande :

PM > Install - Package NetworkCommsDotNet - Version 3.0.3

Après avoir installé avec succès le package dans les deux projets, vous pouvez commencer à coder. Ouvrez le projet ServerApplication et écrivez le code :

public static void ConnectServer() {
  IPHostEntry myhost = Dns.GetHostEntry("localhost");
  IPAddress ipAddr = myhost.AddressList[0];
  IPEndPoint myEndPoint = new IPEndPoint(ipAddr, 11000);

  try {
    Socket listenerSocket = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

    listenerSocket.Bind(myEndPoint);
    listenerSocket.Listen(5);

    Console.WriteLine("Waiting for Client Socket to Coonect...");
    Socket socketHandler = listenerSocket.Accept();

    // data from the client.
    string myData = null;
    byte[] dataBytes = null;

    while (true) {
      dataBytes = new byte[1023];
      int bytesRece = socketHandler.Receive(dataBytes);
      myData += Encoding.ASCII.GetString(dataBytes, 0, bytesRece);

      if (myData.IndexOf("<EOF>") > -1) {
        myData = myData.Remove(myData.Length - 5);
        break;
      }
    }

    Console.WriteLine("Data Received from Client : {0}", myData);

    byte[] msg = Encoding.ASCII.GetBytes("This is the test msg from server");
    socketHandler.Send(msg);
    socketHandler.Shutdown(SocketShutdown.Both);
    socketHandler.Close();
  } catch (Exception e) {
    Console.WriteLine(e.ToString());
  }

  Console.WriteLine("\n Press any key to continue...");
  Console.ReadKey();
}

Ensuite, côté client, écrivez le code suivant :

public static void ConnectClient() {
  byte[] myBytes = new byte[1024];

  try {
    IPHostEntry myhost = Dns.GetHostEntry("localhost");
    IPAddress ipAddr = myhost.AddressList[0];
    IPEndPoint clientEP = new IPEndPoint(ipAddr, 11000);

    Socket senderSocket = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

    try {
      // Connect to the EndPoint
      senderSocket.Connect(clientEP);

      Console.WriteLine("Client Connect to Server at {0}", senderSocket.RemoteEndPoint.ToString());

      // Convert the string into a byte-type array.
      Console.WriteLine("Sending a test message");
      byte[] msg = Encoding.ASCII.GetBytes("This is a test message from Client<EOF>");

      // Send the data using the socket.
      int dataSent = senderSocket.Send(msg);

      // Receive the reply from the server device.
      int dataRec = senderSocket.Receive(myBytes);
      Console.WriteLine("Data Received from Server = {0}",
                        Encoding.ASCII.GetString(myBytes, 0, dataRec));

      // delete the socket
      senderSocket.Shutdown(SocketShutdown.Both);
      senderSocket.Close();
      Console.ReadKey();

    } catch (ArgumentNullException ane) {
      Console.WriteLine(ane.ToString());
    } catch (SocketException se) {
      Console.WriteLine(se.ToString());
    } catch (Exception e) {
      Console.WriteLine(e.ToString());
    }

  } catch (Exception e) {
    Console.WriteLine(e.ToString());
  }
}

Après avoir appelé ces fonctions dans la fonction principale des projets correspondants, vous devez générer le projet ou vous pouvez générer la solution entière. Ensuite, pour exécuter la sortie, accédez à l’explorateur de fichiers de ces projets et exécutez le fichier exe des deux.

La sortie suivante est reçue :

Communication client-serveur - Sortie

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn