C#使用udp如何实现消息的接收和发送

下面是详细讲解“C#使用udp如何实现消息的接收和发送”的攻略,希望对您有所帮助。

UDP协议简介

UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的传输协议,能够在局域网和广域网的IP网络中实现高效的数据传输。它在传输数据时不提供可靠性和完整性的保证,但是却具有速度快、延迟低等优点,因此在实时性较高的应用场景中被广泛使用,如音视频传输、实时游戏等。

消息的发送

引入命名空间

使用UDP协议发送消息,需要使用System.Net.Sockets命名空间下的UdpClient类。因此,需要先在代码文件开头添加引用。

using System.Net.Sockets;

创建UDP连接

使用UdpClient创建UDP连接,并指定对方IP地址和端口号。如果希望发送广播消息,可以将IP地址设置为“255.255.255.255”。

UdpClient udpClient = new UdpClient();
IPEndPoint ipEndPoint= new IPEndPoint(IPAddress.Parse("192.168.1.100"), 8001);  // 发送给指定的IP和端口
//IPEndPoint ipEndPoint= new IPEndPoint(IPAddress.Broadcast, 8001);  // 发送广播消息

构造UDP数据包

使用Encoding对象将消息转换成字节数组,然后将字节数组封装进一个UdpClient标准数据包中。

string message = "Hello World!";
byte[] sendBytes = Encoding.UTF8.GetBytes(message);
UdpClient udpClient = new UdpClient();
IPEndPoint ipEndPoint= new IPEndPoint(IPAddress.Parse("192.168.1.100"), 8001);
udpClient.Send(sendBytes, sendBytes.Length, ipEndPoint);

消息的接收

引入命名空间

使用UDP协议接收消息,同样需要使用System.Net.Sockets命名空间下的UdpClient类。因此,需要先在代码文件开头添加引用。

using System.Net.Sockets;

创建UDP连接

使用UdpClient创建UDP连接,并指定监听的本地IP地址和端口号。

UdpClient udpClient = new UdpClient(8001);  //监听本地端口8001

接收消息

使用UdpClient的Receive方法从网络接收消息,该方法会一直阻塞等待,直到接收到消息。

byte[] receiveBytes = udpClient.Receive(ref ipEndPoint);
string message = Encoding.UTF8.GetString(receiveBytes, 0, receiveBytes.Length);

示例说明

示例1:UDP发送和接收消息

下面来看具体的代码,使用UDP协议发送一条消息“Hello World!”到指定的IP地址和端口,接收端收到消息后回复一条消息“Nice to meet you!”,发送端收到回复后打印出来。

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

class Program
{
    static void Main(string[] args)
    {
        // 发送端
        UdpClient udpClient = new UdpClient();
        IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 8001);
        string message = "Hello World!";
        byte[] sendBytes = Encoding.UTF8.GetBytes(message);
        udpClient.Send(sendBytes, sendBytes.Length, remoteIpEndPoint);

        // 接收端
        UdpClient listener = new UdpClient(8001);
        IPEndPoint localIpEndPoint = new IPEndPoint(IPAddress.Any, 8001);
        byte[] receiveBytes = listener.Receive(ref localIpEndPoint);
        string receiveMessage = Encoding.UTF8.GetString(receiveBytes, 0, receiveBytes.Length);
        Console.WriteLine($"接收到消息:{receiveMessage}");

        // 发送回复
        string reply = "Nice to meet you!";
        byte[] replyBytes = Encoding.UTF8.GetBytes(reply);
        udpClient.Send(replyBytes, replyBytes.Length, remoteIpEndPoint);

        // 接收回复
        receiveBytes = listener.Receive(ref localIpEndPoint);
        receiveMessage = Encoding.UTF8.GetString(receiveBytes, 0, receiveBytes.Length);
        Console.WriteLine($"接收到回复:{receiveMessage}");
    }
}

运行结果如下:

接收到消息:Hello World!
接收到回复:Nice to meet you!

示例2:使用Task异步接收消息

上面的示例中接收消息的代码是同步的,会阻塞主线程。在实际应用中,可能需要使用异步方式接收消息,以免阻塞主线程。下面来看一个使用Task异步接收UDP消息的示例。

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        UdpClient listener = new UdpClient(8001);
        IPEndPoint localIpEndPoint = new IPEndPoint(IPAddress.Any, 8001);
        while (true)
        {
            UdpReceiveResult receiveResult = await listener.ReceiveAsync();
            string receiveMessage = Encoding.UTF8.GetString(receiveResult.Buffer, 0, receiveResult.Buffer.Length);
            Console.WriteLine($"接收到消息:{receiveMessage},来自:{receiveResult.RemoteEndPoint}");
        }
    }
}

运行该程序后,可以在其他终端上使用UDP协议向本机发送消息,程序会非阻塞地接收并打印出消息内容和发送方的地址信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用udp如何实现消息的接收和发送 - Python技术站

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

相关文章

  • .NET Core利用 AsyncLocal 实现共享变量的代码详解

    .NET Core利用 AsyncLocal 实现共享变量的代码详解 在.NET Core应用程序中,有时需要在异步方法之间共享变量。在本攻略中,我们将介绍如何使用AsyncLocal类实现共享变量,并提供两个示例说明。 1. AsyncLocal类 AsyncLocal类是.NET Core中的一个类,用于在异步方法之间共享变量。可以按照以下步骤操作: 引…

    C# 2023年5月16日
    00
  • C#数组中List, Dictionary的相互转换问题

    C#数组中List, Dictionary的相互转换是常见的问题,下面是一些详细的解答。 将List转换为数组 如果你有一个List对象想要转换成数组,可以使用List类的ToArray()方法。示例代码如下: List<int> list = new List<int> { 1, 2, 3 }; int[] array = list…

    C# 2023年6月1日
    00
  • c#快速写本地日志方法

    下面我就为你详细讲解“c#快速写本地日志方法”的完整攻略。 1. 确定需求及文件格式 第一步是确定你的需求及文件格式。一般来说,我们需要记录的日志信息包括时间、级别、描述、来源等。在文件格式上,常见的有TXT、XML和JSON格式等。在这里,我们以TXT格式为例。 2. 创建日志文件 在创建日志文件之前,你需要确定日志文件的路径和名称。一般来说,我们可以把日…

    C# 2023年5月15日
    00
  • FreeSSL申请免费证书

    FreeSSL申请免费证书 FreeSSL 是一个免费证书和 SSL 证书管理平台。旨在为个人和小型企业提供免费 SSL 证书,以加强他们的网站和应用程序的安全性。与传统的 SSL 证书颁发机构不同,FreeSSL 使用自动化过程生成 SSL 证书,并提供一个管理面板,让用户可以轻松管理他们的证书和域名。 1.访问地址 https://freessl.cn/…

    C# 2023年5月8日
    00
  • C#中的char与string详解

    C#中的char与string详解 什么是char? char是C#的一种数据类型,它代表一个单一的字符。每个char变量都使用单引号(”)来表示。 以下是一个使用char的示例 char myChar = ‘a’; 在上面的示例中,我们定义了一个名为myChar的变量,并将它的值设置为小写字母’a’。 什么是string? string是C#的一种数据类…

    C# 2023年6月8日
    00
  • C#利用GDI+画图的基础实例教程

    让我来详细讲解一下 “C#利用GDI+画图的基础实例教程”的完整攻略。 什么是GDI+? GDI+是指图形设备界面,是 Windows 操作系统中的图像绘制 API。通过 GDI+ 可以在 Windows 应用程序中创建图形对象来绘制图形、文字、图像等。GDI+ 的接口与 .NET Framework 配合得很好,可以用于 C#、VB.NET 和其他语言中。…

    C# 2023年5月15日
    00
  • C#使用Interlocked实现线程同步

    C#使用Interlocked实现线程同步 什么是Interlocked Interlocked是C#中用于实现线程同步的一组原子操作。原子操作是不可分割的,会形成一个不可分割的操作单元。Interlocked操作在执行过程中不需要使用锁,而是使用硬件支持的原子操作指令,对数据进行读取、计算和写入,保证操作的原子性。 Interlocked常用的方法 C#中…

    C# 2023年6月7日
    00
  • .net的命名空间类库的简单介绍

    下面我将提供“.net的命名空间类库的简单介绍”的完整攻略。 什么是命名空间 在.Net中,命名空间是用来组织和管理代码的一种机制。它可以让我们把相关的类、结构体、枚举等类型放到一个命名空间下,提高代码的可读性和可管理性。 命名空间的格式 .Net的命名空间是由一系列名称组成的,每个名称之间用点(.)分隔,例如: System.IO.File 这个命名空间表…

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