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 :
- Établissez une connexion entre deux extrémités, puis détruisez cette connexion lorsque la communication est terminée.
- 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.
- 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
.
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.
Pour la programmation côté serveur, créez un autre projet dans la même 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 :
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 :
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