迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

在 C# 中设置客户端-服务器通信

作者:迹忆客 最近更新:2024/02/01 浏览次数:

这个简单的编程教程将讨论客户端-服务器环境中的数据传输。它还将通过 TCP 套接字编程为客户端-服务器通信模型提供基于 C# 的实现。


传输控制协议 (TCP)

开放系统互连 (OSI) 是一种广泛采用的通信参考模型,它解释了计算机如何相互通信。它确保无差错的数据从一端传送到另一端。

分层 OSI 模型定义了发送或接收数据时要遵循的一些规则和协议。所有层都单独工作,并执行从一端到另一端传输数据的任务。

本文将仅解释传输层。该层使用的主要协议是传输控制协议(TCP),主要职责如下:

  1. 在两端建立连接,然后在通信结束时销毁该连接。
  2. 数据传输包括以下任务:
    • 确保数据可靠性并检查数据是否按顺序传输且无错误。
    • 检测错误(如果有)并重新发送丢失的数据包。
    • 控制数据包的流量和速率。
  3. 确认并设置标志。

C# 中设置客户端-服务器通信

让我们转向使用 C# 语言在 .NET 框架中实现客户端/服务器应用程序。我们将使用 Visual Studio Enterprise Edition 2019 进行此实施。

我们将创建两个应用程序,一个用于客户端,一个用于服务器端。对于测试,这两个应用程序都将驻留在同一台计算机上。

首先,我们将创建一个客户端应用程序。为此,打开 Visual Studio 并创建一个新项目。

然后,选择项目类型 Console Application 并单击 Next

 

将项目名称设为 Client Application,将解决方案名称设为 ClientServerApplication。这将为客户端创建一个新项目。

对于服务器端编程,在同一解决方案中创建另一个项目:

这个项目将被命名为 ServerApplication 并且在同一个解决方案中。

创建项目后,你必须添加 Network Comms Dot Net 包文件。为此,你需要使用 NuGet 控制台安装它们。

在图像中像这样转到工具> NuGet 包管理器>包管理器控制台

你将在窗口中看到包管理器控制台,如上图所示。在这个控制台中,我们将编写命令:

PM > Install - Package NetworkCommsDotNet - Version 3.0.3

在两个项目中成功安装包后,就可以开始编码了。打开 ServerApplication 项目并编写代码:

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

然后在客户端,编写以下代码:

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

在对应项目的 main 函数中调用这些函数后,需要构建项目,也可以构建整个解决方案。然后,为了运行输出,导航到这些项目的文件资源管理器并运行两者的 exe 文件。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C# 中发出 HTTP POST Web 请求

发布时间:2024/02/04 浏览次数:131 分类:编程语言

在 C# 中,可以使用 3 种主要方法来发出 HTTP POST Web 请求:WebClient 类,HttpWebRequest 类和 HttpClient 类。本教程将讨论在 C# 中发出 HTTP POST Web 请求的方法。使用 C# 中的 WebClient 类发出 HTTP POST Web 请求

在 C# 中调整图像大小

发布时间:2024/02/04 浏览次数:203 分类:编程语言

有两种主要方法可用于在 C# 中调整图像的大小,Bitmap 类构造函数和 graphics.DrawImage()函数。在本教程中,我们将讨论在C#中调整图像大小的方法。我们将带您完成整个过程,从加载原始图像到保

在 C# 中下载图片

发布时间:2024/02/04 浏览次数:138 分类:编程语言

有 3 种主要方法可用于下载 C# 中的图片,WebClient.DownloadFile()函数,Bitmap 类和 Image.FromStream()函数。在 C# 中使用 WebClient 类下载图片 WebClient 类提供了用于向 C# 中的 URL 发送数据和从 URL 接收数据

在 C# 中使用秒表

发布时间:2024/02/04 浏览次数:139 分类:编程语言

我们可以使用 Stopwatch 类来计算 C# 中的经过时间。使用 C# 中的秒表类计算经过时间 Stopwatch 类在 C# 中准确测量经过的时间。

在 C# 中获取可执行路径

发布时间:2024/02/04 浏览次数:200 分类:编程语言

有 3 种主要方法可用于获取 C# 中程序的可执行路径,即 Assembly 类,AppDomain 类和 Path 类。本教程将介绍获取 C# 代码的可执行路径的方法。使用 C# 中的 Assembly 类获取可执行路径

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便