UDP协议是一种无连接的传输层协议,具有传输速度快、资源消耗低的优势,适合对实时性要求较高的场景。在C#中实现UDP同步通信,主要依赖System.Net.Sockets命名空间下的Socket类,通过同步方法完成数据的收发操作。

UDP同步通信核心原理
UDP同步通信中,服务端和客户端不需要建立连接,服务端需要先绑定本地端口,然后通过同步的ReceiveFrom方法阻塞等待数据;客户端则直接指定目标地址和端口,通过SendTo方法发送数据。同步模式的特点是收发方法会阻塞当前线程,直到操作完成或超时,逻辑流程更直观。
服务端实现步骤与代码
服务端的核心流程是创建Socket、绑定端口、循环接收数据并返回响应,具体实现如下:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace UdpSyncServer
{
class Program
{
static void Main(string[] args)
{
// 创建UDP类型的Socket对象
Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 绑定本地IP和端口,这里使用本地的12345端口
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 12345);
udpServer.Bind(localEndPoint);
Console.WriteLine("UDP服务端已启动,等待客户端消息...");
try
{
while (true)
{
// 定义接收数据的缓冲区
byte[] receiveBuffer = new byte[1024];
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
// 同步接收数据,阻塞直到收到消息
int receiveLength = udpServer.ReceiveFrom(receiveBuffer, ref remoteEndPoint);
string receiveMsg = Encoding.UTF8.GetString(receiveBuffer, 0, receiveLength);
Console.WriteLine($"收到来自{remoteEndPoint}的消息:{receiveMsg}");
// 构造响应消息并返回给客户端
string responseMsg = $"服务端已收到你的消息:{receiveMsg}";
byte[] sendBuffer = Encoding.UTF8.GetBytes(responseMsg);
udpServer.SendTo(sendBuffer, remoteEndPoint);
}
}
catch (Exception ex)
{
Console.WriteLine($"服务端异常:{ex.Message}");
}
finally
{
udpServer.Close();
}
}
}
}客户端实现步骤与代码
客户端不需要绑定固定端口,直接创建Socket后指定服务端地址发送数据,再同步接收服务端的响应,实现如下:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace UdpSyncClient
{
class Program
{
static void Main(string[] args)
{
// 创建UDP类型的Socket对象
Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 指定服务端的IP和端口,这里连接本地的12345端口
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
try
{
while (true)
{
Console.Write("请输入要发送的消息(输入exit退出):");
string inputMsg = Console.ReadLine();
if (inputMsg == "exit")
{
break;
}
// 发送消息到服务端
byte[] sendBuffer = Encoding.UTF8.GetBytes(inputMsg);
udpClient.SendTo(sendBuffer, serverEndPoint);
// 同步接收服务端的响应
byte[] receiveBuffer = new byte[1024];
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
int receiveLength = udpClient.ReceiveFrom(receiveBuffer, ref remoteEndPoint);
string responseMsg = Encoding.UTF8.GetString(receiveBuffer, 0, receiveLength);
Console.WriteLine($"收到服务端响应:{responseMsg}");
}
}
catch (Exception ex)
{
Console.WriteLine($"客户端异常:{ex.Message}");
}
finally
{
udpClient.Close();
}
}
}
}注意事项
- 同步通信的ReceiveFrom方法会阻塞当前线程,如果需要在UI线程中使用,建议放到后台线程执行,避免界面卡死。
- UDP协议不保证数据可靠到达,如果需要可靠传输,需要在应用层自行实现重传、校验等逻辑。
- 端口被占用时会抛出SocketException,启动前需要确认目标端口没有被其他程序占用。
- 接收缓冲区的大小需要根据实际传输数据的大小调整,避免数据截断。
常见问题解答
为什么服务端绑定的是IPAddress.Any?
IPAddress.Any表示服务端会监听本机所有可用的网络接口的指定端口,不管客户端从哪个网卡发送数据,只要端口匹配都能被接收,适配多网卡的场景。
同步和异步UDP通信怎么选择?
如果通信逻辑简单,不需要同时处理多个客户端的请求,同步模式代码更简洁;如果需要高并发处理多个客户端的消息,或者不想阻塞主线程,更适合选择异步模式。