跳到主要内容

C# UDP 编程

介绍

UDP(用户数据报协议)是一种无连接的网络协议,它允许应用程序在网络上发送和接收数据包。与 TCP 不同,UDP 不保证数据包的顺序或可靠性,但它具有低延迟和高效率的特点,适用于实时性要求较高的应用场景,如视频流、在线游戏等。

在 C# 中,System.Net.Sockets 命名空间提供了 UdpClient 类,用于简化 UDP 编程。本文将逐步介绍如何使用 UdpClient 进行 UDP 通信。

UDP 编程基础

1. 创建 UDP 客户端

首先,我们需要创建一个 UdpClient 实例。UdpClient 可以绑定到特定的本地端口,也可以不绑定端口。

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

class Program
{
static void Main()
{
// 创建 UdpClient 实例,绑定到本地端口 11000
UdpClient udpClient = new UdpClient(11000);

Console.WriteLine("UDP 客户端已启动,等待接收数据...");
}
}

2. 发送数据

使用 UdpClientSend 方法可以向指定的远程主机发送数据。

csharp
// 远程主机的 IP 地址和端口
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11001);

// 要发送的数据
string message = "Hello, UDP!";
byte[] sendBytes = Encoding.UTF8.GetBytes(message);

// 发送数据
udpClient.Send(sendBytes, sendBytes.Length, remoteEndPoint);

Console.WriteLine($"已发送消息: {message}");

3. 接收数据

使用 UdpClientReceive 方法可以接收来自远程主机的数据。

csharp
// 接收数据
IPEndPoint receiveEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] receiveBytes = udpClient.Receive(ref receiveEndPoint);

// 将接收到的字节数组转换为字符串
string receivedMessage = Encoding.UTF8.GetString(receiveBytes);

Console.WriteLine($"接收到来自 {receiveEndPoint} 的消息: {receivedMessage}");

实际案例:简单的 UDP 聊天程序

下面是一个简单的 UDP 聊天程序示例,它允许两个用户通过 UDP 协议进行通信。

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

class Program
{
static async Task Main()
{
// 创建 UdpClient 实例,绑定到本地端口 11000
UdpClient udpClient = new UdpClient(11000);

// 远程主机的 IP 地址和端口
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11001);

// 启动接收任务
var receiveTask = ReceiveMessagesAsync(udpClient);

// 启动发送任务
var sendTask = SendMessagesAsync(udpClient, remoteEndPoint);

await Task.WhenAll(receiveTask, sendTask);
}

static async Task ReceiveMessagesAsync(UdpClient udpClient)
{
while (true)
{
// 接收数据
IPEndPoint receiveEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] receiveBytes = await udpClient.ReceiveAsync();
string receivedMessage = Encoding.UTF8.GetString(receiveBytes.Buffer);

Console.WriteLine($"接收到消息: {receivedMessage}");
}
}

static async Task SendMessagesAsync(UdpClient udpClient, IPEndPoint remoteEndPoint)
{
while (true)
{
// 读取用户输入
string message = Console.ReadLine();

// 发送数据
byte[] sendBytes = Encoding.UTF8.GetBytes(message);
await udpClient.SendAsync(sendBytes, sendBytes.Length, remoteEndPoint);

Console.WriteLine($"已发送消息: {message}");
}
}
}

运行结果

假设你在本地运行了两个实例,一个绑定到端口 11000,另一个绑定到端口 11001。你可以在一个实例中输入消息,另一个实例将接收到该消息并显示在控制台上。

总结

UDP 是一种简单而高效的网络协议,适用于对实时性要求较高的应用场景。通过 UdpClient 类,C# 开发者可以轻松实现 UDP 通信。本文介绍了如何创建 UDP 客户端、发送和接收数据,并通过一个简单的聊天程序展示了 UDP 的实际应用。

附加资源与练习

提示

在实际开发中,UDP 通常用于实时性要求较高的场景,如在线游戏、视频流等。如果你需要可靠的数据传输,建议使用 TCP 协议。