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 提供了一种快速、简单的数据传输方式,适用于对传输速度有较高要求而对可靠性要求相对较低的应用场景。
相关文章:
C# 网络编程--关于UDP 通信(二)
UDP (User Datagram Protocol) 是一种无连接的传输层协议,主要用于支持数据报文的传输。它的主要特点包括简单、高效、不保证可靠性和顺序。 1.UDP协议基本概念 1.udp基于IP的简单的协议,不可靠的协议 2.优点:简单、 轻量化、 传输速度高、…...
【k8s集群应用】Kubernetes部署安装-二进制部署实例
文章目录 Kubernetes 部署方式常见的K8S安装部署方式Kubeadm与二进制部署的区别 Kubernetes部署安装环境配置Kubernetes集群初始化配置(实验环境)一、操作系统初始化配置二、部署Docker引擎 etcd 集群搭建配置 etcd 集群 Kubernetes Master 组件部署准备…...
js常见代码输出问题之promise,await,变量提升以及闭包(包括例子以及详细解析)
这里写目录标题 异步事件循环宏任务微任务1. 执行顺序2. 分类 Promise代码输出1. promise.then执行时机2. 宏任务微任务的多轮次3. .then .catch会返回新的promise4. 返回任意一个非 promise 的值都会被包裹成 promise 对象5. .then .catch 的值不能是promise本身6. 值透传7. .…...
遗传算法与深度学习实战(27)——进化卷积神经网络
遗传算法与深度学习实战(27)——进化卷积神经网络 0. 前言1. 自定义交叉算子2. 自定义突变操作符3. 进化卷积神经网络小结系列链接 0. 前言 DEAP toolbox 中提供的标准遗传操作符对于自定义的网络架构基因序列来说是不够的。这是因为任何标准的交叉算子…...
【Vue3】前端使用 FFmpeg.wasm 完成用户视频录制,并对视频进行压缩处理
强烈推荐这篇博客!非常全面的一篇文章,本文是对该博客的简要概括和补充,在不同技术栈中提供一种可行思路,可先阅读该篇文章再阅读本篇: FFmpeg——在Vue项目中使用FFmpeg(安装、配置、使用、SharedArrayBu…...
基础算法——前缀和
由于比赛基本都是采用Dev-C所以,算法篇基本都是采用Dev-C来解释(版本5.11,c11) 首先介绍一下前缀和算法 给定一个数组,有q次询问,每次询问: 两个整数l,r,求出数组 l 到 r的结果 遇…...
spring实例化对象的几种方式(使用XML配置文件)
前言 Spring框架作为一个轻量级的控制反转(IoC)容器,为开发者提供了多种对象实例化的策略。通过这些策略,开发者可以更加灵活地控制对象的生命周期和依赖关系。无论是通过XML配置、注解配置还是Java配置,Spring都能…...
【二叉树】力扣 129.求根节点到叶子节点数字之和
一、题目 二、思路 每找到一个非空节点,之前路径上的所有节点的数量级都要增加1个单位。例如,当前节点为3,之前的节点路径为1 -> 2,presum 1 * 10 2 12,现在路径变为了 1 -> 2 -> 3,sum pres…...
深度学习物体检测之YOLOV5源码解读
V5比前面版本偏工程化,项目化,更贴合实战 一.V5版本项目配置 (1)整体项目概述 首先github直接查找yolov5,下载下来即可。在训练时,数据是怎么处理的?网络模型架构是怎么设计的(如各层的设计)?yolov5要求是大于python3.8与大于等…...
音频数据采样入门详解 - 给Python初学者的简单解释
音频数据采样入门详解 - 给Python初学者的简单解释 声音是如何变成数字的?什么是采样率?为什么要懂这个?Python小例子总结 大家好!今天我们来聊一个有趣的话题:音频数据是如何在计算机中处理的。让我用最简单的方式来解…...
Unity类银河战士恶魔城学习总结(P179 Enemy Archer 弓箭手)
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了敌人弓箭手的制作 Enemy_Archer.cs 核心功能 状态机管理敌人的行为 定义了多个状态对象(如 idleState、moveState、attackState 等),通过状态机管理敌人的…...
SpringCloud集成sleuth和zipkin实现微服务链路追踪
文章目录 前言技术积累spring cloud sleuth介绍zipkin介绍Zipkin与Sleuth的协作 SpringCloud多模块搭建Zipkin Server部署docker pull 镜像启动zipkin server SpringCloud 接入 Sleuth 与 Zipkinpom引入依赖 (springboot2.6)appilication.yml配置修改增加测试链路代码 调用微服…...
Python随机抽取Excel数据并在处理后整合为一个文件
本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,随机从其中选取一部分数据,并将全部文件中随机获取的数据合并为一个新的Excel表格文件的方法。 首先,我们来明确一下本文的具体需求。…...
Linux+Docker onlyoffice 启用 HTTPS 端口支持
文章目录 一、需求二、配置2.1 创建容器2.2 进入容器2.3 生成私钥和证书 2.4 测试访问 一、需求 上篇文章介绍了如何搭建一个 onlyoffice 在线预览服务,但是我们实际场景调用该服务的网站是协议是 https 的 ,但是 onlyoffice 服务还没做配置,…...
在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c
在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c 1. Installing the extension (在 Visual Studio Code 中安装插件)1.1. Extensions for Visual Studio Code1.2. C/C1.2.1. Pre-requisites 1.3. Makefile Tools 2. Configuring your project (配置项目)2.1.…...
python中math模块常用函数
文章目录 math模块简介各种三角函数反三角函数取整函数欧几里得距离绝对值最大公约数开根号幂阶乘函数 math模块简介 math模块是python标准库的一部分,提供了对于浮点数相关的数学运算,下面是常用的一些function 各种三角函数反三角函数 math.cos、ma…...
优化 Vue 3 开发体验:配置 Vite 使用 WebStorm 作为 Vue DevTools 的默认编辑器
优化 Vue 3 开发体验:配置 Vite 使用 WebStorm 替代 VS Code 作为 Vue DevTools 的默认编辑器 在 Vue 3 项目开发中,合理配置开发工具可以大大提升我们的工作效率。本文将介绍如何配置 Vite,使其在使用 Vue DevTools 时将默认编辑器从 VS Co…...
【C语言练习(9)—有一个正整数,求是几位数然后逆序打印】
C语言练习(9) 文章目录 C语言练习(9)前言题目题目解析结果总结 前言 主要到整数的取余(%)和整数的取商(/),判断语句if…else if …else的使用 题目 给一个不多于3位的正整数,要求:一、求它是几位数&…...
热敏打印机的控制
首次接触热敏打印机,本来没有特别之处,花了大概十天时间完成一款猫学王热敏打印机,给到客户体验后,客户反馈说打字看起来不明显,打印照片有条纹,所以引起了我对于他的关注,几点不足之处需要优化…...
【closerAI ComfyUI】电商赋能,AI模特套图生产,各种姿势自定义,高度保持人物服饰场景一致性,摆拍街拍专用
closerAIGCcloserAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性!aigc.douyoubuy.cn 【closerAI ComfyUI】电商赋能,AI模特套图生产,各种姿势自定义,高度保持人物服饰场景一致性,摆拍街拍专用…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
