Socket Udp异步通信举例

在C#中,使用UDP接收消息也可以通过两种异步方式实现:一种是使用BeginReceiveEndReceive方法(基于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}");
        }
    }
}

说明:

  1. APM模式
    • 使用BeginReceiveEndReceive方法,适用于.NET Framework 2.0及以上版本。
    • 需要在回调函数中手动调用BeginReceive以继续接收下一条消息。
  2. TAP模式
    • 使用ReceiveAsync方法,适用于.NET Framework 4.5及以上版本。
    • 使用await关键字,代码更简洁,推荐使用。

注意事项:

  • 端口号:确保发送方和接收方的端口号一致。
  • IP地址:接收方通常绑定到IPAddress.Any,表示监听所有网络接口。
  • 异步循环:在TAP模式中,使用while (true)循环持续接收消息;在APM模式中,需要在回调函数中手动调用BeginReceive以继续接收。

示例运行:

  1. 启动接收端程序(上述代码)。
  2. 使用发送端程序(如之前提供的发送代码)发送消息。
  3. 接收端会打印出接收到的消息和发送方的IP地址及端口号。

这两种方式都可以实现UDP消息的异步接收,选择哪种方式取决于你的项目需求和使用的.NET版本。

上一篇
下一篇