在C#中,使用UDP接收消息也可以通过两种异步方式实现:一种是使用BeginReceive
和EndReceive
方法(基于APM模式),另一种是使用ReceiveAsync
方法(基于TAP模式)。以下是两种方式的示例代码:
1. 使用 BeginReceive
和 EndReceive
(APM模式)
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class UdpReceiverApm
{
private static UdpClient udpClient = new UdpClient(5000); // 监听5000端口
public static void Main(string[] args)
{
Console.WriteLine("UDP Receiver is running (APM mode)...");
udpClient.BeginReceive(ReceiveCallback, null);
Console.ReadLine(); // 保持程序运行
}
private static void ReceiveCallback(IAsyncResult ar)
{
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] receivedData = udpClient.EndReceive(ar, ref remoteEndPoint);
string message = Encoding.UTF8.GetString(receivedData);
Console.WriteLine($"Received message from {remoteEndPoint}: {message}");
// 继续接收下一条消息
udpClient.BeginReceive(ReceiveCallback, null);
}
}
2. 使用 ReceiveAsync
(TAP模式)
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
class UdpReceiverTap
{
private static UdpClient udpClient = new UdpClient(5000); // 监听5000端口
public static async Task Main(string[] args)
{
Console.WriteLine("UDP Receiver is running (TAP mode)...");
while (true)
{
UdpReceiveResult result = await udpClient.ReceiveAsync();
string message = Encoding.UTF8.GetString(result.Buffer);
Console.WriteLine($"Received message from {result.RemoteEndPoint}: {message}");
}
}
}
说明:
- APM模式:
- 使用
BeginReceive
和EndReceive
方法,适用于.NET Framework 2.0及以上版本。 - 需要在回调函数中手动调用
BeginReceive
以继续接收下一条消息。
- 使用
- TAP模式:
- 使用
ReceiveAsync
方法,适用于.NET Framework 4.5及以上版本。 - 使用
await
关键字,代码更简洁,推荐使用。
- 使用
注意事项:
- 端口号:确保发送方和接收方的端口号一致。
- IP地址:接收方通常绑定到
IPAddress.Any
,表示监听所有网络接口。 - 异步循环:在TAP模式中,使用
while (true)
循环持续接收消息;在APM模式中,需要在回调函数中手动调用BeginReceive
以继续接收。
示例运行:
- 启动接收端程序(上述代码)。
- 使用发送端程序(如之前提供的发送代码)发送消息。
- 接收端会打印出接收到的消息和发送方的IP地址及端口号。
这两种方式都可以实现UDP消息的异步接收,选择哪种方式取决于你的项目需求和使用的.NET版本。