使用udpClient类可简化C#中的UDP通信。1. 发送数据:创建UdpClient实例,调用Send()方法指定目标IP和端口,如向127.0.0.1:8888发送”Hello UDP!”;2. 接收数据:绑定端口(如8888),使用Receive()阻塞等待数据,通过IPEndPoint获取发送方信息;3. 异步通信:使用ReceiveAsync()实现非阻塞接收,适合长时间监听;4. 广播支持:设置EnableBroadcast=true后可向局域网广播消息。UDP无连接、高效但不保证可靠,适用于实时性要求高的场景,需应用层处理丢包与顺序问题。

使用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();
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>,包含数据和远程地址。 - 可用于构建服务端或长时间运行的监听程序。
- 注意循环中避免死锁,合理处理异常和取消逻辑。
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基础上加确认机制。