Einrichten der Client-Server-Kommunikation in C#

Muhammad Husnain 15 Februar 2024
  1. Transmission Control Protocol (TCP)
  2. Einrichten der Client-Server-Kommunikation in C#
Einrichten der Client-Server-Kommunikation in C#

Dieses triviale Programmier-Tutorial behandelt die Datenübertragung in einer Client-Server-Umgebung. Es wird auch eine C#-basierte Implementierung für das Client-Server-Kommunikationsmodell durch TCP-Socket-Programmierung bereitstellen.

Transmission Control Protocol (TCP)

Open Systems Interconnection (OSI) ist ein weit verbreitetes Kommunikationsreferenzmodell, das erklärt, wie Computer miteinander kommunizieren können. Es stellt sicher, dass fehlerfreie Daten von einem Ende zum anderen geliefert werden.

Das geschichtete OSI-Modell definiert einige Regeln und Protokolle, die beim Senden oder Empfangen der Daten befolgt werden müssen. Alle Schichten arbeiten einzeln und erfüllen ihre Aufgaben bei der Datenübertragung von einem Ende zum anderen.

In diesem Artikel wird nur die Transportschicht erläutert. Das auf dieser Schicht verwendete Hauptprotokoll ist das Transmission Control Protocol (TCP) und hat die folgenden Hauptaufgaben:

  1. Stellen Sie eine Verbindung zwischen zwei Enden her und zerstören Sie diese Verbindung, wenn die Kommunikation beendet ist.
  2. Übermittlung von Daten, die aus folgenden Aufgaben besteht:
    • Gewährleistet Datenzuverlässigkeit und prüft, ob die Daten sequentiell übertragen werden und fehlerfrei sind.
    • Erkennt den Fehler, falls vorhanden, und sendet die verlorenen Pakete erneut.
    • Steuern Sie den Fluss und die Rate der Datenpakete.
  3. Bestätigung und Flags setzen.

Einrichten der Client-Server-Kommunikation in C#

Lassen Sie uns zur Implementierung der Client/Server-Anwendung im .NET-Framework unter Verwendung der C#-Sprache übergehen. Wir werden diese Implementierung mit Visual Studio Enterprise Edition 2019 durchführen.

Wir werden zwei Anwendungen erstellen, eine für die Clientseite und eine für die Serverseite. Zu Testzwecken befinden sich beide Anwendungen auf demselben Computer.

Zuerst erstellen wir eine Client-Anwendung. Öffnen Sie dazu Visual Studio und erstellen Sie ein neues Projekt.

Wählen Sie dann den Projekttyp Console Application und klicken Sie auf Next.

Wählen Sie Konsolenanwendung aus

Geben Sie den Projektnamen als Client Application und den Lösungsnamen als ClientServerApplication ein. Dadurch wird ein neues Projekt für die Clientseite erstellt.

Legen Sie den clientseitigen Projektnamen und den Lösungsnamen fest

Erstellen Sie für die serverseitige Programmierung ein weiteres Projekt in derselben Lösung:

Legen Sie den serverseitigen Projektnamen und den Lösungsnamen fest

Dieses Projekt wird ServerApplication genannt und in derselben Lösung.

Nachdem Sie die Projekte erstellt haben, müssen Sie die Network Comms Dot Net-Paketdateien hinzufügen. Dazu müssen Sie sie über die NuGet-Konsole installieren.

Gehen Sie wie im Bild zu Tools > NuGet Package Manager > Package Manager Console:

Paketdateien hinzufügen

Sie erhalten die Paket-Manager-Konsole im Fenster, wie im Bild oben hervorgehoben. In diese Konsole schreiben wir den Befehl:

PM > Install - Package NetworkCommsDotNet - Version 3.0.3

Nach erfolgreicher Installation des Pakets in beiden Projekten können Sie mit dem Codieren beginnen. Öffnen Sie das Projekt ServerApplication und schreiben Sie den 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();
}

Schreiben Sie dann auf der Clientseite den folgenden Code:

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());
  }
}

Nachdem Sie diese Funktionen in der Hauptfunktion in den entsprechenden Projekten aufgerufen haben, müssen Sie das Projekt erstellen, oder Sie können die gesamte Lösung erstellen. Navigieren Sie dann zum Ausführen der Ausgabe zum Datei-Explorer dieser Projekte und führen Sie die exe-Datei von beiden aus.

Die folgende Ausgabe wird empfangen:

Client-Server-Kommunikation - Ausgabe

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