C#怎么进行UDP通信 C# UdpClient实现UDP协议编程

来源:这里教程网 时间:2026-02-21 17:29:52 作者:

使用C#进行UDP通信主要依赖于

UdpClient
类,它位于
System.Net.Sockets
命名空间中,封装了底层Socket操作,让UDP协议编程更加简单直观。UDP是一种无连接、不可靠但传输效率高的协议,适合对实时性要求高、能容忍少量丢包的场景,比如音视频传输、心跳包、广播通知等。

1. 使用UdpClient发送UDP数据

要发送UDP数据,创建一个

UdpClient
实例,调用
Send()
方法指定目标IP和端口即可。

示例:向本地127.0.0.1:8888发送一条消息:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
UdpClient sender = new UdpClient();
byte[] data = Encoding.UTF8.GetBytes("Hello UDP!");
sender.Send(data, data.Length, "127.0.0.1", 8888);
sender.Close();
Send(byte[], int, string, int)
:传入字节数组、长度、目标IP和端口号。
无需建立连接,直接发送。 发送后应调用
Close()
释放资源,或使用
using
语句自动管理。

2. 使用UdpClient接收UDP数据

接收端需绑定到指定IP和端口,然后调用

Receive()
方法等待数据到来。

示例:监听本机8888端口接收消息:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
UdpClient receiver = new UdpClient(8888); // 绑定端口
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
try {
    byte[] receivedData = receiver.Receive(ref remoteEP);
    string message = Encoding.UTF8.GetString(receivedData);
    Console.WriteLine($"收到来自 {remoteEP} 的消息:{message}");
}
catch (Exception ex) {
    Console.WriteLine("接收出错:" + ex.Message);
}
finally {
    receiver.Close();
}
new UdpClient(8888)
表示绑定本机8888端口。
IPEndPoint
用于接收发送方的信息(IP和端口)。
Receive()
是阻塞方法,直到收到数据才返回。

3. 实现异步UDP通信(非阻塞)

为避免主线程被

Receive()
阻塞,可使用异步方式接收数据。

推荐使用

ReceiveAsync()
(.NET Framework 4.5+ 或 .NET Core/5+):

UdpClient udpClient = new UdpClient(8888);
async Task ListenAsync() {
    while (true) {
        var result = await udpClient.ReceiveAsync();
        string message = Encoding.UTF8.GetString(result.Buffer);
        Console.WriteLine($"来自 {result.RemoteEndPoint}:{message}");
    }
}
// 启动监听
await ListenAsync();
ReceiveAsync()
返回
ValueTask<udpreceiveresult></udpreceiveresult>
,包含数据和远程地址。
可用于构建服务端或长时间运行的监听程序。 注意循环中避免死锁,合理处理异常和取消逻辑。

4. 广播与多播(可选扩展)

UDP支持向局域网广播消息,只需将目标IP设为广播地址(如192.168.1.255)并启用广播选项:

UdpClient broadcaster = new UdpClient();
broadcaster.EnableBroadcast = true;
byte[] msg = Encoding.UTF8.GetBytes("Broadcast message");
broadcaster.Send(msg, msg.Length, "192.168.1.255", 8888);
broadcaster.Close();
必须设置
EnableBroadcast = true
,否则会抛出异常。
广播仅限局域网,路由器通常不会转发。

基本上就这些。UdpClient简化了UDP编程,适合快速实现轻量级通信。注意UDP不保证送达、不保证顺序,应用层需自行处理可靠性问题。如果需要稳定传输,建议使用TCP或在UDP基础上加确认机制。

相关推荐