C# 网络编程--关于UDP 通信(二)

UDP (User Datagram Protocol) 是一种无连接的传输层协议,主要用于支持数据报文的传输。它的主要特点包括简单、高效、不保证可靠性和顺序。

1.UDP协议基本概念

1.udp基于IP的简单的协议,不可靠的协议
2.优点:简单、 轻量化、 传输速度高、要求可靠性不太高
3.缺点:没有流量控制,没有应答确认机制。不能解决丢包重发错顺序问题

2.UDP 特点:

建立连接:与 TCP 不同,UDP 在发送数据前不需要建立连接。这意味着发送方可以直接向接收方发送数据报文。
发送数据:发送方向接收方发送数据报文时,每个数据报文都包含源端口、目的端口、长度和校验和等信息。这些信息被封装在 UDP 头部中,随后数据报文被传递给 IP 层进行发送。
接收数据:接收方接收到数据报文后,会检查 UDP 头部中的校验和以验证数据的完整性。如果校验和正确,接收方将数据报文传递给上层应用程序;如果校验和错误,数据报文会被丢弃。
无确认机制:UDP 不提供数据传输的确认机制,这意味着发送方不会收到接收方关于是否成功接收到数据的反馈。因此,UDP 不能保证数据的可靠传输。
无序传输:UDP 不保证数据报文的顺序,即发送方发送的数据报文可能以不同的顺序到达接收方。这要求上层应用程序自行处理数据的排序问题。
多播和广播:UDP 支持多播和广播通信,允许多个接收方同时接收相同的数据报文,适用于视频流媒体、在线游戏等应用场景。

3.UDP示例

UDP 服务器

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class UdpServer
{
    private const int Port = 5000;
    private const int BufferSize = 1024;

    static void Main(string[] args)
    {
        // 创建一个 UDP 套接字
        UdpClient udpClient = new UdpClient(Port);
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, Port);

        Console.WriteLine("UDP Server is running...");

        while (true)
        {
            try
            {
                // 接收数据报文
                byte[] receivedBytes = udpClient.Receive(ref remoteEndPoint);
                string receivedData = Encoding.UTF8.GetString(receivedBytes);

                Console.WriteLine($"Received data from {remoteEndPoint}: {receivedData}");

                // 发送响应
                string responseData = "Message received!";
                byte[] sendBytes = Encoding.UTF8.GetBytes(responseData);
                udpClient.Send(sendBytes, sendBytes.Length, remoteEndPoint);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }
}

UDP 客户端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class UdpClientExample
{
    private const int Port = 5000;
    private const string ServerIp = "127.0.0.1";
    private const int BufferSize = 1024;

    static void Main(string[] args)
    {
        // 创建一个 UDP 套接字
        UdpClient udpClient = new UdpClient();

        // 设置服务器的 IP 地址和端口
        IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIp), Port);

        Console.WriteLine("UDP Client is running...");

        while (true)
        {
            try
            {
                Console.Write("Enter message to send: ");
                string message = Console.ReadLine();
                byte[] sendBytes = Encoding.UTF8.GetBytes(message);

                // 发送数据报文
                udpClient.Send(sendBytes, sendBytes.Length, serverEndPoint);

                // 接收响应
                byte[] receivedBytes = udpClient.Receive(ref serverEndPoint);
                string receivedData = Encoding.UTF8.GetString(receivedBytes);

                Console.WriteLine($"Received response from server: {receivedData}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }
}

4.UDP 的应用场景

以下展示 UDP 在不同应用场景中的优势,尤其是在对实时性要求较高的场景中。

1. 在线视频会议

场景描述: 在线视频会议应用(如 Zoom、Teams)通常使用 UDP 协议来传输音视频数据。
• 发送数据:发送方(例如会议主持人)的摄像头和麦克风捕获音视频数据,这些数据被编码成小的数据包,并通过 UDP 发送到接收方。
• 接收数据:接收方(例如参会者)接收到这些数据包后,解码并显示音视频内容。
• 无确认机制:由于 UDP 不提供确认机制,即使某些数据包丢失,也不会重新发送,这有助于减少延迟,保证实时性。
• 无序传输:接收方可能会接收到乱序的数据包,但视频编解码器通常能够处理这种情况,确保视频流畅播放。

2. 在线游戏

场景描述: 多人在线游戏(如《英雄联盟》、《绝地求生》)通常使用 UDP 协议来传输游戏状态数据。
• 发送数据:服务器或客户端定期发送游戏状态更新(如玩家位置、生命值等)到其他客户端。
• 接收数据:接收方客户端接收到这些状态更新后,更新本地的游戏状态。
• 无确认机制:即使某些状态更新数据包丢失,也不会影响整体游戏体验,因为后续的状态更新会覆盖之前的旧数据。
• 无序传输:游戏引擎通常能够处理乱序的数据包,确保游戏状态的准确性和实时性。

3. DNS 查询

场景描述: DNS(域名系统)查询通常使用 UDP 协议来解析域名。
• 发送数据:客户端(如浏览器)向 DNS 服务器发送一个包含域名的查询请求。
• 接收数据:DNS 服务器接收到查询请求后,查找对应的 IP 地址,并将结果返回给客户端。
• 无确认机制:如果客户端没有收到响应,它可能会重发查询请求,但不会等待确认。
• 无序传输:DNS 查询通常是一次性的,所以无序传输不是问题。

4. 多播视频流

场景描述: 多播视频流(如 IPTV)使用 UDP 协议将视频数据同时发送给多个接收方。
• 发送数据:视频服务器将视频数据包发送到一个多播地址。
• 接收数据:所有订阅了该多播地址的接收方都能接收到这些数据包。
• 无确认机制:即使某些数据包丢失,也不会重新发送,以保证视频流的实时性。
• 无序传输:接收方可能会接收到乱序的数据包,但视频编解码器通常能够处理这种情况,确保视频流畅播放。

在某些场景,为什么用UDP,而不用TCP呢?

打个比方:就拿视频来说,哪怕是某一时刻网络不好导致数据丢包了,那也影响也不大,顶多就是卡了一下或者花屏了一下,下一帧的数据包马上就顶替上一次的数据了,实际对我们来说还是可接受的,由此可说,当运用在可靠性低时效性快速高这场景下使用最合适不过了
要是换成TCP,有可能视频会卡的很严重,无法直视,因为TCP 出现丢包了,还需要等丢的包发过来才行,这过程延迟就很高了

5.总结

UDP 提供了一种快速、简单的数据传输方式,适用于对传输速度有较高要求而对可靠性要求相对较低的应用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1 汇编语言

课程概要 人与人沟通需要使用到语言,人与计算机沟通也需要一种语言进行,你要跟计算机进行沟通,必须要使用计算机可以识别的语言,这种语言我们称之为机器语言,也就是0和1,二进制。 但对于人来说机器语言&a…

每天40分玩转Django:简介和环境搭建

Django简介和环境搭建 一、课程概述 学习项目具体内容预计用时Django概念Django框架介绍、MVC/MTV模式、Django特点60分钟环境搭建Python安装、pip配置、Django安装、IDE选择45分钟创建项目项目结构、基本配置、运行测试75分钟实战练习创建个人博客项目框架60分钟 二、Djang…

AI学习记录 - 依据 minimind 项目入门

想学习AI,还是需要从头到尾跑一边流程,最近看到这个项目 minimind, 我也记录下学习到的东西,需要结合项目的readme看。 1、github链接 https://github.com/jingyaogong/minimind?tabreadme-ov-file 2、硬件环境:英伟达4070ti …

对象键值对的修改

一:一个对象,过滤掉键对应的值是空数组的键,保留值不是空数组的键值对 const obj {a: [1, 2, 3],b: [],c: [4, 5],d: [],e: [6] };// 过滤掉值为空数组的键值对 const filteredObj Object.fromEntries(Object.entries(obj).filter(([key, v…

Java基础知识(四) -- 面向对象(中)

1.封装 1.1 概述 面向对象编程语言是对客观世界的模拟,客观世界里每一个事物的内部信息都是隐藏在对象内部的,外界无法直接操作和修改,只能通过指定的方式进行访问和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其…

02. Docker:安装和操作

目录 一、Docker的安装方式 1、实验环境准备 1.1 关闭防火墙 1.2 可以访问网络 1.3 配置yum源 2、yum安装docker 2.1 安装docker服务 2.2 配置镜像加速 2.3 启动docker服务 3、二进制安装docker 3.1 下载或上传安装包并解压 3.2 配置使用systemctl管理 3.3 配置镜像…

【人工智能】OpenAI O1模型:超越GPT-4的长上下文RAG性能详解与优化指南

在人工智能(AI)领域,长上下文生成与检索(RAG) 已成为提升自然语言处理(NLP)模型性能的关键技术之一。随着数据规模与应用场景的不断扩展,如何高效地处理海量上下文信息,成…

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍01

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)

华为FreeBuds Pro 4查找到底怎么用?华为FreeBuds Pro 4有星闪精确查找和离线查找,离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能,当前仅华为FreeBuds Pro 4充电盒支持…

Python爬虫之Scrapy框架基础入门

Scrapy 是一个用于Python的开源网络爬虫框架,它为编写网络爬虫来抓取网站数据并提取结构化信息提供了一种高效的方法。Scrapy可以用于各种目的的数据抓取,如数据挖掘、监控和自动化测试等。 【1】安装 pip install scrapy安装成功如下所示:…

【电子元器件】电感基础知识

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、 电感的基本工作原理 1. 电感的基本工作原理如下: (1) 当线圈中有电流通过时&#…

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下: //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…

C#,在 C# 语言中将 LaTeX 转换为 PNG 或 JPG 图像

在 C 语言中将 LaTeX 转换为 PNG 或 JPG 图像# 12月 28, 2021 2 分钟 法尔汉拉扎 在 C 语言中将 TeX 转换为 PNG JPG 图像# TeX 格式用于处理技术和科学文件。它通常用于交流或发布此类文档。在某些情况下,您可能需要将 TeX 文件渲染为 PNG 或 JPG 等图像…

顺序表(数据结构初阶)

文章目录 顺序表一:线性表1.1概念: 二:顺序表2.1概念与结构:2.2分类:2.2.1静态顺序表2.2.2动态顺序表 2.3动态顺序表的实现声明(初始化)检查空间容量尾插头插尾删头删查找指定位置之前插入数据指…

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面,一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期!12 月 15 日(周日)上午&…

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了,能搜到这篇文章说明你了解 总之就是一个单片机重启程序,设定好超时时间,在超时时间内没有喂狗,单片机就会复位 主要应用在单片机异常重启方面,比如程序跑飞(注意程序跑飞时你就…

pdb调试器详解

文章目录 1. 启动 pdb 调试器1.1 在代码中插入断点1.2 使用命令行直接调试脚本 2. 常用调试命令2.1 基本命令2.2 高级命令2.3 断点操作 3. 调试过程示例4. 调试技巧4.1 条件断点4.2 自动启用调试4.2.1 运行程序时指定 -m pdb4.2.2在代码中启用 pdb.post_mortem4.2.3 使用 sys.e…

(转,自阅,侵删)【LaTeX学习笔记】一文入门LaTeX(超详细)

【LaTeX学习笔记】一文入门LaTeX(超详细)-阿里云开发者社区LaTeX中主要分为导言区和正文区导言区通常用于定义文档的格式、语言等(全局设置)。常用的LaTex命令主要有\documentclass,\usepackage等。下面分别对几个常用…

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …

MFC学习笔记专栏开篇语

MFC,是一个英文简写,全称为 Microsoft Foundation Class Library,中文翻译为微软基础类库。它是微软开发的一套C类库,是面向对象的函数库。 微软开发它,是为了给程序员提供方便,减少程序员的工作量。如果没…