C#中Socket通信用法实例详解

C#中Socket通信用法实例详解

1. 简介

本文将详细讲解 C#中 Socket 通信的用法以及实例。Socket 是即插即用的通用数据交换接口,常用于不同操作系统、不同软件之间的通信。在 C# 中,通过 System.Net.Sockets 命名空间下的实现,可以轻松实现 Socket 通信,可以方便地实现 TCP、UDP 等协议。

2. 实例1:C#中基于TCP协议实现Socket通信

我们首先通过一个简单的示例来详细讲解如何在 C# 中基于 TCP 协议实现 Socket 通信。

以下是客户端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Client {
    public static void Main() {
        // 创建一个 TCP/IP socket.
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // 连接到远程 endpoint
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);

        try {
            // 向服务器端发起连接请求
            clientSocket.Connect(remoteEP);

            Console.WriteLine("Socket 连接到 " + clientSocket.RemoteEndPoint.ToString());

            // 发送数据到服务器端
            byte[] msg = Encoding.ASCII.GetBytes("Hello from client");
            clientSocket.Send(msg);

            // 从服务器端接收响应
            byte[] responseMsg = new byte[1024];
            int responseSize = clientSocket.Receive(responseMsg);
            Console.WriteLine("接收到的响应: " + Encoding.ASCII.GetString(responseMsg, 0, responseSize));

            // 关闭连接
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
        } catch (Exception ex) {
            Console.WriteLine(ex.ToString());
        }
    }
}

以下是服务器端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Server {
    public static void Main() {
        // 数据缓冲区
        byte[] buffer = new byte[1024];

        // 服务器监听IP地址及端口
        IPEndPoint serverIP = new IPEndPoint(IPAddress.Any, 11000);

        // 创建TCP/IP socket
        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try {
            // 绑定到本地端点并启动监听
            serverSocket.Bind(serverIP);
            serverSocket.Listen(10);

            Console.WriteLine("等待客户端连接...");

            // 接受客户端请求
            Socket clientSocket = serverSocket.Accept();

            Console.WriteLine("客户端连接成功:" + clientSocket.RemoteEndPoint.ToString());

            // 接收来自客户端的请求
            int size = clientSocket.Receive(buffer);
            Console.WriteLine("接收到客户端请求: " + Encoding.ASCII.GetString(buffer, 0, size));

            // 向客户端发送响应数据
            byte[] responseMsg = Encoding.ASCII.GetBytes("Hi, client!");
            clientSocket.Send(responseMsg);

            // 关闭连接
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
        } catch (Exception ex) {
            Console.WriteLine(ex.ToString());
        }
    }
}

运行上述代码,将会打印出类似如下的输出:

等待客户端连接...
客户端连接成功:127.0.0.1:59806
接收到客户端请求: Hello from client

3. 示例2:C#中基于UDP协议实现Socket通信

接下来,我们通过另一个示例来详细讲解如何在 C# 中基于 UDP 协议实现 Socket 通信。

以下是客户端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Client {
    public static void Main() {
        // 创建UDP socket
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // 发送数据到服务器端
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);
        byte[] msg = Encoding.ASCII.GetBytes("Hello from client using UDP");
        clientSocket.SendTo(msg, remoteEP);

        // 接收服务器端的响应
        EndPoint remoteAddr = new IPEndPoint(IPAddress.Any, 0);
        byte[] buffer = new byte[1024];
        int responseSize = clientSocket.ReceiveFrom(buffer, ref remoteAddr);
        Console.WriteLine("来自服务器端的响应: " + Encoding.ASCII.GetString(buffer, 0, responseSize));

        // 关闭Socket
        clientSocket.Close();
    }
}

以下是服务器端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Server {
    public static void Main() {
        // 创建UDP socket
        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // 绑定服务器 IP 和端口
        IPEndPoint serverEP = new IPEndPoint(IPAddress.Any, 11000);
        serverSocket.Bind(serverEP);

        // 接收客户端的请求
        EndPoint remoteAddr = new IPEndPoint(IPAddress.Any, 0);
        byte[] buffer = new byte[1024];
        int size = serverSocket.ReceiveFrom(buffer, ref remoteAddr);
        Console.WriteLine("来自客户端的请求: " + Encoding.ASCII.GetString(buffer, 0, size));

        // 向客户端发送响应
        byte[] responseMsg = Encoding.ASCII.GetBytes("Hi, client using UDP!");
        serverSocket.SendTo(responseMsg, remoteAddr);

        // 关闭Socket
        serverSocket.Close();
    }
}

运行上述代码,将会打印出类似如下的输出:

来自客户端的请求: Hello from client using UDP

4. 结论

通过上例的讲解,我们可以得出以下结论:

  • 在 C# 中,通过 System.Net.Sockets 命名空间下的实现,可以轻松实现 Socket 通信;
  • Socket 是即插即用的通用数据交换接口,常用于不同操作系统、不同软件之间的通信;
  • 可以使用 TCP、UDP 等协议实现 Socket 通信;
  • 在实现 Socket 通信时,需要特别注意数据包大小和传输协议等因素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中Socket通信用法实例详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • c#数据类型基础

    C#数据类型基础 一、基础数据类型 C#中的基本数据类型有以下几种: 整型:int、long、short、byte、sbyte、uint、ulong、ushort 浮点型:float、double 字符型:char 布尔型:bool 对象型:object 字符串型:string 空类型:void 其中,整型数据类型可以存储整数;浮点型数据类型可以存储带小数点…

    C# 2023年5月15日
    00
  • ASP.NET Core扩展库之日志功能的使用详解

    ASP.NET Core扩展库之日志功能的使用详解 在ASP.NET Core中,日志功能是非常重要的。本攻略将提供详细的步骤和示例说明,演示如何使用ASP.NET Core扩展库中的日志功能。 步骤 步骤1:创建一个新的ASP.NET Core Web应用程序 首先,需要创建一个新的ASP.NET Core Web应用程序。可以使用以下命令在命令行中创建一…

    C# 2023年5月17日
    00
  • c#程序删除自身代码示例分享

    下面是” C#程序删除自身代码示例分享”的完整攻略。 1. 实现原理 C#代码删除自身的实现原理是通过使用Process类的Start静态方法和ProcessStartInfo类来实现。Process类可以帮助你控制与其他进程交互的行为。 代码可以使用Process类的Start方法启动一个新的进程。这个新的进程可以是你自己的程序,也可以是其他的程序。可以使…

    C# 2023年5月15日
    00
  • .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.

    因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时:   public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWe…

    C# 2023年4月19日
    00
  • C#递归读取XML菜单数据的方法

    在C#中,我们可以使用递归方法来读取XML菜单数据。递归方法是一种自我调用的方法,它可以在方法内部调用自身,以便处理嵌套的数据结构。本文将介绍如何使用递归方法来读取XML菜单数据,并提供两个示例来演示如何使用这些技术。 读取XML菜单数据的方法 以下是读取XML菜单数据的步骤: 创建一个XmlDocument对象,用于加载XML文件。 使用XmlDocume…

    C# 2023年5月15日
    00
  • C# PictureBox图片控件实现图片交换

    下面是“C# PictureBox图片控件实现图片交换”的完整攻略: 简介 在.NET Windows Forms应用程序中,PictureBox控件是一个常用的控件,用于显示图像并对其进行操作。其中,图片交换是一个常见的操作,本文将从以下几个方面介绍如何使用PictureBox控件实现图片交换: PictureBox控件的基本使用; 从本地文件读取图片并显…

    C# 2023年5月31日
    00
  • C# Linq的Last()方法 – 返回序列中的最后一个元素

    C#的Linq是一种强大的查询语言,可在许多情况下极大简化代码。其中一个用于筛选序列中的元素的方法是Last()。在这篇文章中,我们将详细探讨如何使用C#的Linq Last()方法,并提供至少两个代码示例,以帮助您更好地理解它的工作原理。 Last() 方法的介绍 Last() 是一个用于从给定的序列中筛选出最后一个元素的方法。如果找不到符合要求的元素,则…

    C# 2023年4月19日
    00
  • Winform窗体如何改变语言类型

    Winform 窗体的语言设置主要涉及以下两方面: 改变窗体语言的方式 处理措施 下面我们将会讲解如何进行以上两个方面设置。 改变窗体语言的方式 Winforms 默认依赖系统语言,在资源文件中保存语言翻译。有三种常见方式实现表单翻译: 静态文本资源文件 动态文本资源文件 使用第三方库 静态文本资源文件 使用静态文本资源文件时,我们在应用程序中会有一个包含预…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部