如何使用C#实现UDP协议的同步通信

来源:前端技术作者:广州SEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何使用C#实现UDP协议的同步通信》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用C#实现UDP协议的同步通信》有用,将其分享出去将是对创作者最好的鼓励。

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

如何使用C#实现UDP协议的同步通信

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通信怎么选择?

如果通信逻辑简单,不需要同时处理多个客户端的请求,同步模式代码更简洁;如果需要高并发处理多个客户端的消息,或者不想阻塞主线程,更适合选择异步模式。

C#UDP协议同步通信Socket编程修改时间:2026-06-07 01:09:06

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。