UDP协议详解+代码演示
1、UDP协议基础
1. UDP是什么?
UDP(User Datagram Protocol,用户数据报协议)是传输层的核心协议之一,与TCP并列。它的主要特点是:
-
无连接:通信前不需要建立连接(知道对端的IP和端口号就直接进行传输,不需要建立连接)
-
不可靠:不保证数据包的顺序、完整性或可达性(没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息)
-
大小受限:⼀次最多传输64k(UDP协议首部中有⼀个16位的最大长度.也就是说⼀个UDP能传输的数据最大长度是 64K(包含UDP首部))
-
轻量级:头部开销小(仅8字节)
-
高效:没有TCP的握手、确认和重传机制
2. UDP报文结构
UDP数据包(称为数据报)由头部和数据部分组成:
-
源端口号(2字节):发送方端口
-
目标端口号(2字节):接收方端口
-
数据报长度(2字节):头部+数据的长度
-
校验和(2字节):错误检测(可选)如果校验和出错则直接丢弃
2、UDP的核心特性
1. 无连接通信:UDP不需要预先建立连接,直接发送数据报。这类似于寄信,不需要确认收件人是否在家。
2. 不可靠传输:UDP不提供:数据包确认机制、丢失重传机制、数据包排序功能
3.面向数据报:每个UDP数据报都是独立的,这与TCP的字节流模式不同
4.支持广播和多播:UDP可以向多个主机同时发送数据:
-
单播 :一对一
-
广播 :一对所有
-
多播 :一对一组
3、基于UDP的应用层协议
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
当然,也包括我们自己写UDP程序时自定义的应用层协议。
4、Java中的UDP编程
主要使用了两个类 :
1、DatagramSocket :用于发送和接收数据报的套接字
// 创建UDP套接字(绑定随机端口)
DatagramSocket socket = new DatagramSocket();// 创建绑定特定端口的套接字
DatagramSocket serverSocket = new DatagramSocket(8080);
2、DatagramPacket :表示UDP数据报的容器
// 创建接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 创建发送数据包
String message = "Hello UDP";
byte[] data = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
data,
data.length,
InetAddress.getByName("localhost"),
8080
);
5、完整Java UDP示例
1.Echoserver:UDP服务器,接收客户端消息并原样返回
package Network.UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class Echoserver {//创建一个socket对象private DatagramSocket socket;//构造方法,初始化socket对象public Echoserver(int port) throws SocketException {socket = new DatagramSocket(port);}//启动服务器,完成主要的业务逻辑public void start() throws IOException {System.out.println("服务器启动!");while(true) {//1.接收客户端的请求并解析//1)创建一个字节数组(DatagramPacket 对象),用于存储接收到的数据DatagramPacket reqPacket = new DatagramPacket(new byte[4096],4096);//2)通过receive读取网卡的数据,如果网卡没有收到数据,就会阻塞等待socket.receive(reqPacket);//3)把DATagramPacket中的数据解析成字符串,只需要从DatagramPacket取到有效的树即可String request = new String(reqPacket.getData(),0,reqPacket.getLength());//2.根据请求计算响应String response = process(request);//3.把响应写回客户端//1)把响应字符串转成字节数组,并封装成DatagramPacket对象DatagramPacket resPacket = new DatagramPacket(response.getBytes(),response.getBytes().length,reqPacket.getSocketAddress());//2)通过socket把DatagramPacket对象发送出去 (把DatagramPacket写回到客户端)socket.send(resPacket);//4.打印日志System.out.printf("[%s:%d] req: %s,resp: %s\n",reqPacket.getAddress(),reqPacket.getPort(),request,response);}}//由于是“回显服务器”,所以响应和请求是一样的,直接返回请求即可public String process(String request) {return request;}public static void main(String[] args) throws IOException {Echoserver server = new Echoserver(9090);server.start(); //回显服务器完成}
}
代码详细解析:
①创建 EchoServer 服务端的类,定义成员变量
-
DatagramSocket:UDP通信的核心类,用于发送和接收数据报
-
封装在类中作为成员变量,整个生命周期内有效
②构造方法
-
创建绑定到指定端口的 DatagramSocket(可能会抛出异常,如:该端口已被占用)
-
port 是服务器自身绑定的监听端口号,等待客户端发送数据,客户端需要知道服务器的这个端口号才能向其发送消息。
客户端通过该端口找到服务器,而客户端的端口由系统动态分配。
这种设计体现了 UDP 无连接的特性,服务器只需关注自身绑定端口即可接收所有客户端消息。
③核心业务逻辑(start方法)
- while 无限循环接收来自客户端的数据,这里可以根据自己的需求更改接收次数
- 创建缓冲区:分配一个4096字节(字节大小自行定义不溢出就行)的空数组,存储接收到的数据
- 阻塞等待数据报到达(数据此时已存入 reqPacket 的字节数组中)如果 reqPacket 没有接收到客户端发来的数据这里会阻塞等待
- 声明 String 类型的 request 变量,将 reqPacket 中的数据解析为字符串
- getData() :获取字节数组(可能包含多余的空字节)
- getLength() :获取实际有效数据长度(避免解析无效字节)
在网络编程中,将响应(
response
)转成字节数组(byte[]
)再发送是必要的步骤,这与计算机底层的数据传输机制和网络协议的特性密切相关。
- process() :返回响应后的数据,由于整段代码实现的是 Echo(回显) 服务器代码,响应内容=请求内容,所以方法中直接返回请求即可
- soclet.send() :将数据发送回客户端
附上发送回客户端的终端代码
- 打印日志:打印客户端信息和通信内容
④主方法
-
new Echoserver(9090) :调用构造函数,创建绑定到
9090
端口的DatagramSocket
(UDP套接字) -
server.start() :启动服务器循环,等待客户端数据报
2.EchoClient:UDP客户端,发送消息并显示服务器返回的响应
package Network.UDP;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class EchoClient {private DatagramSocket socket = null;private String serverIp;private int serverPort;public EchoClient(String serverIp, int serverPort) throws IOException { socket = new DatagramSocket();this.serverIp = serverIp;this.serverPort = serverPort;} //启动客户端,发送数据,接收数据,关闭连接public void start() throws IOException {Scanner scanner = new Scanner(System.in);System.out.println("客户端启动!");while(true) {//1.从控制台读取要发送的数据内容(用字符串表示)System.out.print(">");String request = scanner.nextLine(); //2.构造成UDP请求,并发送.不光要填内容,还要填服务器的地址和端口号DatagramPacket reqPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort); socket.send(reqPacket);//3.接收服务器响应的数据DatagramPacket resPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(resPacket);String response = new String(resPacket.getData(),0,resPacket.getLength());//4.把响应的数据解析并打印System.out.println(response);}}public static void main(String[] args) throws IOException {EchoClient echoclient = new EchoClient("127.0.0.1",9090);echoclient.start();}
}
详细代码解析:
①创建 EchoClient 客户端的类,定义成员变量
-
socket :客户端UDP套接字
-
serverIp/serverPort :服务器地址信息
②构造方法
- DatagramSocket ( ) 为客户端随机分配一个端口号
- 保存服务器地址信息
③核心业务逻辑(start方法)
- request 用户输入要发送的数据
- reqPacket 封装要发送的数据
- request.getBytes() :将用户输入的字符串转换为字节数组
- request.getBytes().length :获取字节数组的长度,表示要发送的数据大小
- InetAddress.getByName(serverIp) :通过服务器的IP地址获取对应的 InetAddress 对象,表示数据要发送到的目标地址
- serverPort :服务器的端口号,表示数据要发送到的端口
- socket.send() :调用 send 方法将数据报发送到指定的目标地址和端口
- resPacket() :接收服务器发回的响应数据,socket.receive() 是一个阻塞操作,直到接收到数据才会继续执行
- response :提取响应内容,将接收到的字节数据转换为字符串
④主方法
- 创建客户端实例,连接本地服务器的9090端口
- start 启动客户端
6、UDP编程注意事项
1.数据报大小限制
- UDP数据报最大长度理论为65535字节
- 实际受MTU限制(通常1500字节)
- 建议保持数据报在1472字节以内(IPv4)
2.数据边界问题
- 每个 receive() 调用接收一个完整的数据报
- 不会出现TCP的“粘包”问题
3.错误处理
- 网络不可达
- 端口未监听
- 数据包丢失
4.安全性考虑
- UDP易受DDoS攻击
- 应考虑实现应用层的验证机制
相关文章:
UDP协议详解+代码演示
1、UDP协议基础 1. UDP是什么? UDP(User Datagram Protocol,用户数据报协议)是传输层的核心协议之一,与TCP并列。它的主要特点是: 无连接:通信前不需要建立连接(知道对端的…...
QT事件Trick
拖动 void DWidget::mousePressEvent(QMouseEvent *event) {if(event->button()Qt::LeftButton){QListWidgetItem *selItem currentItem();if(selItem! nullptr){m_startPosevent->pos(); //记录鼠标按下时的起始位置}}QListWidget::mousePressEvent(event); }void DW…...
解答UnityShader学习过程中的一些疑惑(持续更新中)
一、坐标系相关 shader中会有几种空间: 模型空间:以物体自己为中心原点 世界空间:就是unity的世界坐标 观察空间(视图空间):以相机为中心的坐标系 裁剪空间:是一个4d空间,有x,y,z,w…...
【图论 拓扑排序 bfs】P6037 Ryoku 的探索|普及+
本文涉及知识点 C图论 CBFS算法 P6037 Ryoku 的探索 题目背景 Ryoku 对自己所处的世界充满了好奇,她希望能够在她「死」之前尽可能能多地探索世界。 这一天,Ryoku 得到了一张这个世界的地图,她十分高兴。然而,Ryoku 并不知道…...
Spring Boot定时任务
在 Spring Boot 中实现定时任务主要依赖于Scheduled注解和 Spring 调度器。 基本概念 定时任务,简单来说就是在特定的时间点或按照一定的时间间隔自动执行的任务。在 Spring Boot 中,实现定时任务主要依赖于 Spring 框架提供的 Scheduled 注解和 TaskSc…...
如何使用electron-forge开发上位机ui
Electron Forge是一个用于快速构建、打包和发布Electron应用程序的工具。它提供了一种简单的方式来设置Electron项目,并使用现代工具和最佳实践来管理应用程序的开发和部署过程。使用Electron Forge,开发人员可以轻松地创建跨平台的桌面应用程序…...
idea启动springboot方式及web调用
使用以下方式启动springboot. 我这里是微服务, 本地调试需要启动程序使用 1. 通过maven检测到Profile配置 2. web调用 我这里直接用 apifox接口调用, 带着token和一些必要参数。有这几点: 请求头要加的token需要是网页上F12获取到的 如果是微服务本地调用。url需要…...
利用EMQX实现单片机和PyQt的数据MQTT互联
https://www.dong-blog.fun/post/2050 基于MQTT的设备监控与控制系统设计 引言 物联网(IoT)设备的远程监控与控制是现代智能系统的基础需求。本文将介绍一个基于MQTT协议的设备监控与控制系统,该系统由两部分组成:模拟单片机设备和PyQt客户端。我们将…...
C#/.NET/.NET Core技术前沿周刊 | 第 36 期(2025年4.21-4.27)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
Context7 MCP:提供实时、版本特定的文档以解决AI幻觉问题
在实际开发中,使用AI辅助编码常常出现令人沮丧的问题:AI提供的API调用建议往往已经过时,或者根本不存在。 特别是当您使用最新版库时,这个问题尤为明显。 Upstash团队开发的Context7开源工具正是为解决这一痛点而生。 版本不匹配导致的API错误 现代开发库迭代速度快,常…...
电路研究9.3.2——合宙Air780EP中的AT开发指南:HTTP(S)-PDP的研究
按照推荐的GPRS模块的学习顺序,现在需要研究的是HTTP(S)了,所以我们就继续学习吧。 9.5.2 HTTP(S)应用指南 应用概述 4G 模块支持 HTTP 和 HTTPS 协议(这个确实也考虑过了,但是不知道合不合适呢,而且我们计划的通讯是只…...
K8S ConfigMap 快速开始
一、什么是 ConfigMap? ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的 API 对象,支持以键值对(Key-Value)或文件的形式存储配置,允许将配置与镜像解耦,实现配置的集中管理和动态更新。 二、主要用…...
【星海出品】K8S调度器leader
发现K8S的技术资料越写越多,独立阐述一下K8S-Scheduler-leader 调度器通过Watch机制来发现集群中【新创建】且尚未被调度【unscheduled】到节点上的pod。 由于 Pod 中的容器和 Pod 本身可能有不同的要求,调度程序会过滤掉任何不满足 Pod 特定调度需求的…...
第十二届蓝桥杯 2021 C/C++组 空间
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 空间 - 蓝桥云课 思路: 思路详解&#…...
通过深度学习推进增材制造:当前进展与未来挑战综述
通过深度学习推进增材制造:当前进展与未来挑战综述 原文信息: 标题:Advancing Additive Manufacturing through Deep Learning: A Comprehensive Review of Current Progress and Future Challenges 作者:Amirul Islam Saimon, Emmanuel Yangue, Xiaowei Yue, Zhenyu (…...
深入蜂窝物联网 第三章 LTE-M(Cat-M1)详解:省电机制与移动特性
1. 前言与应用场景 在蜂窝物联网阵营中,LTE-M(Cat-M1) 兼具低功耗和中速率,且支持移动场景下的无缝切换,因而成为物流追踪、可穿戴设备、智能路灯、共享单车等场景的首选。 本章将系统剖析: 核心特性:PSM、eDRX 与移动性保障; 协议流程:简化的 RRC/NAS 步骤; 时序图…...
软件设计师速通其一:计算机内部数据表示
考试资料推荐 ,这也是大部分图片的出处。本文章主要将视频原本讲的不详细、不便于理解的东西摆开揉碎了给到读者。相信本文能帮您更好更快的学习知识。本文也是您考前快速复习的不二之选。本文会用星星来表示每个考点的重要性,其中一颗★表示课外拓展&am…...
Kubernetes》》k8s》》Taint 污点、Toleration容忍度
污点 》》 节点上 容忍度 》》 Pod上 在K8S中,如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。如果不能容忍,那就无法调度到该节点。 污点和容忍度的概念 》》污点等级——>node 》》容忍度 —>pod Equal——>一种是等…...
【爬虫】一文掌握 adb 的各种指令(adb备忘清单)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 入门设备基础Logcat文件管理远程 Shell包安装Paths手机信息包信息设备相关命令权限Logs常见的 ADB 命令将文件推送到 Android 设备的下载文件夹列出所有已安装的包并获取完整路径从安卓设备中提取文件从主机安装 APK 到…...
1.7无穷级数
引言 无穷级数是考研数学一的核心内容,涵盖数项级数、幂级数、傅里叶级数等核心概念。本文系统梳理4大考点,结合公式速查与实战示例,助你高效突破级数难点! 考点一:数项级数敛散性判定 1️⃣ 正项级数 (1) 比较审敛…...
vitest | 测试框架vitest | 总结笔记
测试框架 vitest 介绍 网址:Vitest | Next Generation testing framework 特点:①支持vite的生态系统,②兼容jest语法 ③HMR测试(速度快) ④ ESM(js的原生支持) 安装 Vitest: npm …...
使用 ELK 实现全链路追踪:从零到一的实践指南
前言 在现代分布式系统中,随着服务数量的增加,系统的复杂性也呈指数级增长。为了快速定位问题、分析性能瓶颈,全链路追踪成为一项必不可少的能力。本文将详细介绍如何利用 ELK(Elasticsearch Logstash Kibana) 实现…...
AI智能体开发实战:从概念到落地的全流程解析
一、AI智能体:重新定义人机协作 什么是AI智能体? AI智能体是具备感知-思考-行动闭环能力的程序实体,能够通过传感器(如文本输入、图像识别)获取信息,基于大模型推理决策,并通过API、机器人等执…...
如何搭建spark yarn 模式的集群
搭建Spark on YARN集群的步骤 Spark on YARN模式允许Spark作业在Hadoop YARN资源管理器上运行,这样可以更好地与Hadoop生态系统集成并共享集群资源。以下是搭建Spark YARN集群的详细步骤: 前提条件 已安装并配置好Hadoop集群(包括HDFS和YAR…...
DDoS 攻击如何防护?2025最新防御方案与实战指南
一、DDoS 攻击的致命威胁:你的业务离瘫痪有多近? 1. 2024 年 DDoS 攻击现状 攻击规模:全球日均攻击峰值突破7.2Tbps,混合型攻击占比超 65%(来源:Cloudflare)行业重灾区: 行业攻击占…...
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目
安装 pnpm install icraft/player-react --saveimport { ICraftPlayer } from "icraft/player-react";export default function MyScene() {return <ICraftPlayer srcyour-scene.iplayer />; }icraft/player-react 为开发者提供了一站式的3D数字孪生可视化解决…...
esm使用-包括esmfold和embedding
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言零、安装一、esmfold的使用二、esm2的embedding1.模型加载与准备2.读入数据3.提取残基级表示4.生成序列级表示(均值池化)5.可视化自注意力接触图6.潜在问题与改进建议7.小结总结前言 主要参…...
【Nginx】 使用least_conn负载均衡算法是否能将客户端的长连接分散到不同的服务器上demo
为了验证Nginx在关闭HTTP Keepalive的情况下,使用least_conn负载均衡算法是否能将客户端的长连接分散到不同的服务器上,我们可以搭建一个简单的环境。这个环境包括: 一个Nginx服务器作为负载均衡器。两个后端服务器(可以使用简单…...
TMI投稿指南(三):共同作者
IEEE 作者编辑风格手册 --- IEEE Editorial Style Manual for Authors 投稿之后检查路径: IEEE 作者门户:登录 --- IEEE Author Gateway: Login 共同第一作者:在许多领域,被视为成为第一作者是件好事。但只有一个人可以是第一作…...
Java多线程入门案例详解:继承Thread类实现线程
本文通过一个简单案例,讲解如何通过继承 Thread 类来实现多线程程序,并详细分析了代码结构与运行机制。 一、前言 在 Java 中,实现多线程主要有两种方式: 继承 Thread 类 实现 Runnable 接口 本文以继承 Thread 类为例&#x…...
Transformer Prefill阶段并行计算:本质、流程与思考
Transformer Prefill阶段并行计算:本质、流程与思考 “为什么Transformer在Prefill阶段可以并行?并行到什么程度?哪里还需要同步?今天讲清楚!” 引子 在大语言模型(LLMs)爆发的时代,…...
KUKA机器人自动备份设置
在机器人的使用过程中,对机器人做备份不仅能方便查看机器人的项目配置与程序,还能防止机器人项目和程序丢失时进行及时的还原,因此对机器人做备份是很有必要的。 对于KUKA机器人来说,做备份可以通过U盘来操作。也可以在示教器上设…...
Lua 第13部分 位和字节
13.1 位运算 Lua 语言从 5.3 版本开始提供了针对数值类型的一组标准位运算符。与算术运算符不同的是,位运算符只能用于整型数。位运算符包括 &( 按位与)、|(按位或)、~(按…...
下载同时返回其他参数
一般情况下下载的接口是没有返回值的,直接返回一个文件 浏览器直接触发文件下载 但是有一些奇葩需求,除了文件外还需要一些其他字段返回。这个时候就只能把文件转成字符串返回,然后再由前端做下载或者展示 后台获取字符 byte[] byte[] bo…...
240428 leetcode exercises
240428 leetcode exercises jarringslee 文章目录 240428 leetcode exercises[25. K 个一组翻转链表 ](https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/3663828/xian-fan-zhuan-lian-biao-zai-kyi-ge-zu-f-lgaj/)🔁 探宗求源 其义自见 [75. 颜色…...
SQLMesh 审计与测试:确保数据质量的利器
在数据科学项目中,确保数据质量和准确性至关重要。SQLMesh 提供了审计和测试两种工具来验证数据。本文将介绍 SQLMesh 的审计功能,并与测试进行对比,帮助您更好地理解如何在项目中使用这些工具。 SQLMesh 审计 SQLMesh 的审计功能可以帮助您…...
SQL Server 存储过程开发规范
SQL Server 存储过程开发规范(高级版) 1. 总则 1.1 目标 本规范旨在: 提高存储过程的事务一致性、异常可追踪性、错误透明度。 统一日志记录、错误码管理、链路追踪(Trace ID)。 支持复杂事务场景(嵌套…...
图像处理篇---信号与系统的应用
文章目录 前言一、信号表示层面图像作为二维信号二、系统特性分析线性移变系统建模采样系统理论应用时域采样定理在帧率选择中的应用三、变换域处理多维傅里叶分析小波变换与多分辨率分析四、系统响应特性人类视觉系统(HVS)建模摄像机系统响应五、编码系统中的信号处理预测编…...
什么是 Web 标准?为什么它们对 SEO 和开发很重要?
网页标准为何重要?谷歌解析SEO优势 在当今数字营销领域,搜索引擎优化(SEO)是网站提升可见性和吸引自然流量的关键策略。然而,许多网站管理员和营销人员可能忽略了一个重要的SEO因素——网页标准。谷歌的SEO专家深入解…...
Python 正则表达式 re 包
一、常见正则表达式符号 符号含义示例.匹配任意单个字符(除了换行)r"a.c" 可匹配 "abc"、"a1c" 等\d匹配任何数字(0-9)r"\d" 匹配 "123"、"56"\w匹配字母、数字或下…...
leetcode0230. 二叉搜索树中第 K 小的元素-medium
1 题目:二叉搜索树中第 K 小的元素 官方标定难度:中 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1: 输入:r…...
Linux环境变量配置与std访问环境变量
文章目录 前言1. 用户环境变量快速配置1.2 **以上语句的具体解释:**1.3 $PATHNAME实现增量式添加 2.系统级永久配置与避坑指南2.1 特殊字符处理2.2 动态PATH管理2.3 敏感信息保护2.4 环境调试命令 3. cstd中访问环境变量 前言 首先介绍一下Linux下各目录操作符的含…...
【go】go语言slice/map的产生背景,及原理理解
介绍一下Slice 先讲一下slice的产生背景,首先,go本身是有数组的,但是不会自动扩容,然而实际工作中会有很多场景是要求能自动扩容的,比如说你接用户的数据,你肯定要设置一个可以自动扩容的数组来接ÿ…...
机器学习day3 - KNN的api调用
使用KNN算法判断是否为传入的图片是否为苹果 """ 使用KNN算法判断是否为传入的图片是否为苹果 """ # 导入需要的库 from sklearn.model_selection import train_test_split # 导入数据集划分函数 from sklearn.preprocessing import StandardS…...
Qt内置图标速查表
文章目录 1、说明🌾2、实现效果🌱Qt6.7以下版本Qt6.7以上版本 3、主要代码🌳 更多精彩内容👉个人内容分类汇总 👈 1、说明🌾 在我们使用Qt开发程序时,需要美化界面总会想到贴图,显示…...
Python(14)推导式
在 Python 编程中,推导式是一种强大而简洁的语法结构,它能让开发者以简洁的方式从一个数据序列创建另一个新的数据序列。无论是处理列表、字典、集合还是元组,推导式都能大显身手。这篇博客将结合菜鸟教程中的内容,通过丰富的代码…...
React速通笔记
相关视频: 黑马程序员前端React18入门到实战视频教程,从reacthooks核心基础到企业级项目开发实战(B站评论、极客园项目等)及大厂面试全通关_哔哩哔哩_bilibili 一、React介绍 React由Meta公司开发,是一个用于 构建W…...
深入蜂窝物联网:第二章 深度解读 NB-IoT:协议栈、部署与典型应用
1. NB-IoT 简介与应用场景 NB-IoT(Narrowband-IoT,窄带物联网)是3GPP在LTE演进基础上,为海量低速率IoT设备设计的无线接入技术。它仅占用 200 kHz 或 180 kHz(Guard-band)带宽,通过扩频和重复发射,提高了深度覆盖能力。 典型应用 远程抄表:电表、水表、气表等周期性少…...
处理对象集合,输出Map<String, Map<String, List<MyObject>>>格式数据,无序组合键处理方法
需求:对象有字段A,B,C,需要判断对象之间AB两个字段相同的对象 如: 对象1,Aaaa,Bbbb 对象2,Aaaa,Bbbb 对象3,Abbb,Baaa 对象4,Abbb,Baaa…...
基于SpringBoot的食物营养分析与推荐网站系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...