webrtc建立连接的过程
WebRTC 连接全过程:从零到视频通话的每一步
WebRTC 是个神奇的技术,让浏览器直接进行点对点(P2P)音视频通话或数据传输,不用每次都靠服务器中转。想知道 Alice 和 Bob 是怎么通过 WebRTC 建立视频通话的吗?下面是整个过程,拆分成几个简单步骤,带你搞清楚每一步都在干啥!
1. 初始化:准备好通话的“装备”
-
干了啥:
- Alice 和 Bob 各自打开浏览器或应用,启动 WebRTC 的核心对象——RTCPeerConnection。这就像是给他们配了个“通信工具箱”,用来管理连接。
- 他们还会用 getUserMedia 打开摄像头和麦克风,获取音视频流(就像打开 Zoom 的摄像头)。
- 这些音视频流会被添加到 RTCPeerConnection 中,准备好后续传输。
-
为啥重要:
- 这一步是打基础,相当于准备好“通话设备”和“通话内容”(音视频流)。
- 他们还得告诉 RTCPeerConnection 一些服务器地址(比如 STUN 和 TURN 服务器),用来后面解决网络问题。
-
代码示例(简单版):javascript
const pc = new RTCPeerConnection({iceServers: [{ urls: "stun:stun.l.google.com:19302" }] }); navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(stream => {stream.getTracks().forEach(track => pc.addTrack(track, stream));});
2. 信令:通过“中间人”约好通话规则
-
干了啥:
- Alice 和 Bob 需要先“约好”怎么通话,比如用什么视频格式、音频编码。这通过交换 SDP(Session Description Protocol,会话描述协议) 实现。
- SDP 是什么? SDP 就像一份“通话合同”,记录了:
- 媒体类型(视频、音频,还是数据通道)。
- 编码格式(比如 H.264 视频、Opus 音频)。
- 传输协议(比如用 SRTP 加密传输)。
- 注意:SDP 不包含具体的网络地址(IP 和端口),只管“规则”,不管“路径”。
- 具体过程:
- Alice 创建一个 Offer(SDP),说:“我想这样通话,你同意吗?”然后通过信令服务器(通常是 WebSocket 或 HTTP)发给 Bob。
- Bob 收到 Offer,检查后创建 Answer(也是 SDP),说:“我同意,咱就按这规则来!”然后通过信令服务器发回给 Alice。
- Alice 收到 Answer,双方确认规则一致。
-
信令服务器干啥?
- 信令服务器就像个“快递员”,只负责把 SDP(Offer 和 Answer)在 Alice 和 Bob 之间传递。它不参与实际的音视频传输,任务完成后就“下班”了。
-
为啥重要:
- SDP 交换让双方知道用什么技术细节通话,比如“我用 H.264 视频,你得支持这个格式”。
- 没有这一步,双方就像不知道对方用什么语言,没法开始对话。
-
代码示例:javascript
// Alice 创建 Offer pc.createOffer().then(offer => pc.setLocalDescription(offer)).then(() => signalingServer.send({ type: "offer", sdp: pc.localDescription }));// Bob 接收 Offer,创建 Answer pc.setRemoteDescription(new RTCSessionDescription(offer)).then(() => pc.createAnswer()).then(answer => pc.setLocalDescription(answer)).then(() => signalingServer.send({ type: "answer", sdp: pc.localDescription }));
3. ICE 候选收集与交换:寻找“最佳路径”
-
干了啥:
- 光有通话规则(SDP)还不够,Alice 和 Bob 得知道对方的“地址”才能直接连上。这就是 ICE(Interactive Connectivity Establishment,交互式连接建立) 的任务。
- ICE 候选是什么? 候选就是可能的网络地址(IP 和端口),包括:
- 本地地址:设备在局域网的地址(像 192.168.x.x)。
- 公网地址:通过 STUN 服务器 发现的公网 IP 和端口。
- 中继地址:如果 P2P 连不上,用 TURN 服务器 提供的转发地址。
- 具体过程:
- Alice 和 Bob 的 RTCPeerConnection 自动收集候选地址(边收集边触发 onicecandidate 事件)。
- 每次收集到一个候选,他们通过信令服务器发给对方(和 SDP 交换一样,信令服务器当“快递员”)。
- 双方收到对方的候选后,添加到自己的 RTCPeerConnection 中,准备测试。
-
为啥 SDP 不直接包含地址?
- SDP 只管“规则”,地址信息是动态的,收集需要时间(比如通过 STUN 服务器查询公网地址)。
- 设备可能有多个地址(Wi-Fi、4G、TURN 中继),ICE 要测试哪个最好用,SDP 没法提前知道。
-
为啥重要:
- 大多数设备在 NAT(网络地址转换)或防火墙后面,ICE 帮他们找到彼此的公网地址,绕过网络限制。
- 这一步就像 Alice 和 Bob 在迷雾中互相喊:“我在哪儿,你在哪儿?”直到找到能碰面的地点。
-
代码示例:javascript
// Alice 发送 ICE 候选 pc.onicecandidate = event => {if (event.candidate) {signalingServer.send({ type: "candidate", candidate: event.candidate });} };// Bob 接收 ICE 候选 signalingServer.onmessage = message => {if (message.type === "candidate") {pc.addIceCandidate(new RTCIceCandidate(message.candidate));} };
4. ICE 测试:试出“能走通的路”
- 干了啥:
- ICE 框架拿到了双方的候选地址后,开始“试路”。它会测试所有可能的地址对(比如 Alice 的公网地址 vs Bob 的本地地址),看哪一对能连通。
- 优先级:
- 直接 P2P:如果 Alice 和 Bob 在同一局域网或 NAT 允许,直接用本地或公网地址。
- TURN 中继:如果 P2P 失败(比如防火墙太严格),用 TURN 服务器转发数据(但这会增加延迟)。
- ICE 通过发送 STUN 请求(探测包)来检查连通性,找到最优路径。
- 为啥重要:
- 网络环境千奇百怪(NAT、防火墙、运营商限制),ICE 像个“导航仪”,确保总能找到一条路。
- 它优先选 P2P,减少对服务器的依赖,降低延迟和成本。
5. 连接建立:P2P 通路打通!
- 干了啥:
- 一旦 ICE 找到一个可用的地址对(比如 Alice 的公网 IP 和 Bob 的公网 IP),RTCPeerConnection 状态变成 connected,P2P 连接正式建立。
- 此时,Alice 和 Bob 可以直接通信,不再需要信令服务器(除非用 TURN 中继)。
- 为啥重要:
- 这是通话的“开场时刻”,P2P 连接成功意味着音视频可以直接传输,延迟低、效率高。
6. 数据传输:开始聊起来!
-
干了啥:
- 音视频流通过 RTP(实时传输协议) 和 SRTP(安全实时传输协议) 在 P2P 通道上传输,加密用 DTLS 保证安全。
- 如果需要传文件或文本(比如聊天消息),可以用 RTCDataChannel,就像个高速的“数据管道”。
-
为啥重要:
- 这是 WebRTC 的核心价值:低延迟、高质量的 P2P 音视频或数据传输。
- 比如 Zoom 的视频通话、Google Meet 的屏幕共享,都靠这一步。
-
代码示例(数据通道):javascript
const dc = pc.createDataChannel("chat"); dc.onopen = () => dc.send("嗨,Bob!"); dc.onmessage = event => console.log("收到:", event.data);
7. 连接终止:挂断电话,收拾好
-
干了啥:
- 通话结束时,Alice 和 Bob 关闭 RTCPeerConnection,停止音视频流,释放资源。
- 这就像挂断电话,把摄像头和麦克风关掉。
-
代码示例:javascript
pc.close(); stream.getTracks().forEach(track => track.stop());
总结:WebRTC 连接的“全景图”
WebRTC 的连接过程就像组织一场远程聚会:
- 初始化:准备好摄像头、麦克风,装好“通话工具”。
- 信令:通过“快递员”(信令服务器)交换 SDP,约好用什么格式通话。
- ICE 候选:互相发“地址”,看看能从哪儿连上。
- ICE 测试:试出哪条路最好走。
- 连接建立:找到路,P2P 通道通了!
- 数据传输:开始视频聊、传文件,畅快交流。
- 连接终止:聊完挂断,收拾好。
整个过程的核心是 SDP 确定规则,ICE 找到路径,两者配合让 WebRTC 在复杂的网络环境下也能实现高效的 P2P 通信。信令服务器只是个“临时助手”,真正的音视频数据靠 P2P,省服务器、降延迟!
想深入一点?
- 如果你对 SDP 的具体格式、ICE 候选的细节,或者怎么用 Node.js 搭信令服务器感兴趣,可以留言,我再写篇进阶篇!
- 或者试试自己写个 WebRTC 视频通话 Demo,网上有不少开源项目可以参考哦!
优化亮点:
- 口语化但严谨:用“快递员”“导航仪”等比喻让过程生动,技术细节(如 SDP 内容、ICE 作用)准确无误。
- 结构清晰:每个步骤有“干了啥”“为啥重要”,便于读者快速抓住重点。
- 代码点缀:少量代码示例增加技术感,但不让非开发者感到负担。
- 博客友好:语气轻松,适合直接复制到博客,吸引技术或半技术读者。
如果你觉得需要调整语气(比如更专业或更简短),或者想加点图表(比如流程图),告诉我,我可以再改!
相关文章:
webrtc建立连接的过程
WebRTC 连接全过程:从零到视频通话的每一步 WebRTC 是个神奇的技术,让浏览器直接进行点对点(P2P)音视频通话或数据传输,不用每次都靠服务器中转。想知道 Alice 和 Bob 是怎么通过 WebRTC 建立视频通话的吗?…...
system verilog 语句 耗时规则
在 SystemVerilog 中,确实有一类语句是**不消耗仿真时间(zero simulation time)**的,我们一般叫它们: ✅ 零延迟语句(Zero-Time Statements) 🔹1. 什么是“不费时间”的语句? 这些语句在仿真时…...
【Docker】在Ubuntu平台上的安装部署
写在前面 docker作为一种部署项目的辅助工具,真是太好用了需要魔法,不然无法正常运行笔者环境:ubuntu22.04 具体步骤 更新系统包索引 sudo apt update安装必要依赖包 sudo apt install -y apt-transport-https ca-certificates curl softwa…...
2025年阅读论文的常用工具推荐
在快速发展的学术界,阅读和整理论文的能力对于研究者和学生来说至关重要。随着科技的进步,各种工具应运而生,帮助我们更高效地处理文献。本文将为您推荐一些2025年最常用的阅读论文工具,让您的学术之路更加顺畅。 1. SumiNote S…...
pod内部共享命名空间与k8s命名空间是一个东西吗?
文章目录 小知识-命名空间**下面着重介绍一下刚刚提到的内部命名空间**IPC NamespaceNetwork Namespace 本文摘自于我的免费专栏《Kubernetes从0到1(持续更新)》请多关注 小知识-命名空间 注意,首先我要强调一点,Kubernetes命名空…...
Linux笔记---进程间通信:匿名管道
1. 管道通信 1.1 管道的概念与分类 管道(Pipe) 是进程间通信(IPC)的一种基础机制,主要用于在具有亲缘关系的进程(如父子进程、兄弟进程)之间传递数据,其核心特性是通过内核缓冲区实…...
JAVA设计模式——(三)桥接模式
JAVA设计模式——(三)桥接模式(Bridge Pattern) 介绍理解实现武器抽象类武器实现类涂装颜色的行为接口具体颜色的行为实现让行为影响武器修改武器抽象类修改实现类 测试 适用性 介绍 将抽象和实现解耦,使两者可以独立…...
设计模式--工厂模式详解
工厂模式 作用: 实现了创建者与调用者的分离 详细分类 简单工厂模式 工厂方法模式 抽象工厂模式 OOP七大原则: 开闭原则:一个软件的实体应该对拓展开发,对修改关闭 依赖反转原则:要针对接口编程,不…...
每天五分钟深度学习PyTorch:图像的处理的上采样和下采样
本文重点 在pytorch中封装了上采样和下采样的方法,我们可以使用封装好的方法可以很方便的完成采样任务,采样分为上采样和下采样。 上采样和下采样 下采样(缩小图像)的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。 下采样( 放大图像)的…...
前端面试场景题
目录 1.项目第一次加载太慢优化 / vue 首屏加载过慢如何优化 2.说说了解的es6-es10的东西有哪些 ES6(ES2015)之后,JavaScript 新增了许多实用的数组和对象方法,下面为你详细介绍: 3.常见前端安全性问题 XSS&#…...
国际化不生效
经过我的重重检查 最终发现是 版本问题。 原本下载默认next版本cnpm install vue-i18nnext 下载 国际化插件 cnpm install vue-i18n^9.14.3 删除掉node_models,再重新加载包:cnpm install 这时候就可以正常显示了 国际化操作: en.js zh…...
新一代人工智能驱动医疗数智化:范式变革、实践方向及路径选择
人工智能(AI)正以前所未有的速度重构医疗健康行业的底层逻辑,从数据获取、知识建模到临床决策支持,AI不仅是“辅助工具”,更日益成为医疗生产力体系的核心引擎。随着大模型、计算平台和数智基础设施的迅猛发展,医疗数智化正进入从“点状创新”走向“系统重构”的深水区。…...
OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…...
大模型安全吗?数据泄露与AI伦理的黑暗面!
大模型安全吗?数据泄露与AI伦理的黑暗面! 随着人工智能技术的飞速发展,尤其是大型语言模型(如GPT-3、BERT等)的出现,AI的应用场景越来越广泛,从智能客服到内容生成,从医疗诊断到金融…...
穿越链路的旅程:深入理解计算机网络中的数据链路层
一、引言 在计算机网络的七层模型中,数据链路层(Data Link Layer) 是连接物理世界与逻辑网络世界的关键一环。它位于物理层之上,网络层之下,负责将物理层的“比特流”转换成具有结构的数据帧,并确保数据在…...
《AI大模型应知应会100篇》第35篇:Prompt链式调用:解决复杂问题的策略
第35篇:Prompt链式调用:解决复杂问题的策略 摘要 在大模型应用中,单次提示的能力往往受限于上下文长度和任务复杂度。为了解决这些问题,Prompt链式调用应运而生。本文将深入探讨如何通过分解任务、设计逻辑链路、传递中间结果&am…...
管理100个小程序-很难吗
20公里的徒步-真难 群里的伙伴发起了一场天目山20公里徒步的活动,想着14公里都轻松拿捏了,思考了30秒后,就借着春风带着老婆孩子就出发了。一开始溪流清澈见底,小桥流水没有人家;青山郁郁葱葱,枯藤老树没有…...
算法恢复训练-Part01-数组
注:参考的某算法训练营的计划 核心注意点 在 Golang(和大多数主流语言,如 C/C)中,二维数组按行访问的效率更高。因为它符合 Go 的内存连续存储结构,能提高 CPU Cache 命中率,减少内存跳跃带来…...
软件黑盒与白盒测试详解
黑盒测试与白盒测试的核心对比 一、定义与核心目标 黑盒测试 定义:将程序视为“黑盒”,仅通过输入和输出验证功能是否符合需求规格,不关注内部代码逻辑。目标:确保功能完整性、输入输出正确性及用户体验,例如验证购物车…...
本文通俗简介-优雅草星云物联网AI智控系统软件介绍-星云智控是做什么用途的??-优雅草卓伊凡
本文通俗简介-优雅草星云物联网AI智控系统软件介绍-星云智控是做什么用途的??-优雅草卓伊凡 星云智控:物联网设备实时监控的革新力量 一、引言 在科技飞速发展的当下,物联网技术的广泛应用使得各类设备的实时监控与管理变得愈发…...
达梦统计信息收集情况检查
查询达梦某个对象上是否有统计信息 select id,T_TOTAL,N_SMAPLE,N_DISTINCT,N_NULL,BLEVEL,N_LEAF_PAGES,N_LEAF_USED_PAGES,LAST_GATHERED from sysstats where id IN (select id from sysobjects where upper(name)upper(&objname));可能有系统对象,可以增加…...
【MQ篇】RabbitMQ之发布订阅模式!
目录 引言一、 回顾:简单模式与工作队列模式的局限 😔二、 发布/订阅模式详解:消息的“广播站” 📻三、 RabbitMQ 中的交换机类型:不同的“广播方式” 📻四、 Java (Spring Boot) 代码实战Fanout 模式的完整…...
如何批量为多张图片(JPG、PNG、BMP、WEBP 等格式)添加自定义水印保护
「鹰迅批量处理工具箱」提供了强大的批量水印添加功能,支持常见的图片格式,如 JPG、JPEG、PNG、BMP、GIF、WEBP 等。用户不仅可以选择添加文字水印或图片水印,还能自定义设置水印的样式、位置和透明度等参数,操作简单而高效&#…...
LeetCode每日一题4.23
题目 问题分析 计算每个数字的数位和:对于从 1 到 n 的每个整数,计算其十进制表示下的数位和。 分组:将数位和相等的数字放到同一个组中。 统计每个组的数字数目:统计每个组中有多少个数字。 找到并列最多的组:返回数…...
Kafka简介
简介 基本概念 Kafka是分布式发布 - 订阅消息系统,最初由LinkedIn开发,后成为Apache项目一部分,可类比为放鸡蛋的篮子,生产者产蛋放入,消费者从中取蛋 。 消息系统 优势:分布式系统,易扩展&am…...
大数据利器:Kafka与Spark的深度探索
在大数据领域,Kafka和Spark都是极为重要的工具。今天就来和大家分享一下我在学习和使用它们过程中的心得。 Kafka作为分布式消息系统,优势显著。它吞吐量高、延迟低,能每秒处理几十万条消息,延迟最低仅几毫秒;可扩展性…...
使用logrotate实现日志轮转
logrotate 是一个强大的 Linux 工具,用于自动化管理日志文件的轮转、压缩、删除和归档。它能有效防止日志文件无限增长,节省磁盘空间,同时保持日志的可追溯性。以下是详细讲解 logrotate 的用法,涵盖安装、配置、测试、自动化、常…...
第52讲:农业AI + 区块链——迈向可信、智能、透明的未来农业
目录 一、为什么农业需要“AI+区块链”? 二、核心应用场景解读 1. 农产品溯源系统 2. 农业信贷与保险精准评估 3. 农业碳足迹追踪与碳汇交易 三、案例实战分享:智能溯源 + 区块链合约 四、面临挑战与展望 五、总结 在数字农业时代,“AI” 和 “区块链” 是两股不容忽…...
视频智能分析平台EasyCVR无线监控:全流程安装指南与功能应用解析
在当今数字化安防时代,无线监控系统的安装与调试对于保障各类场所的安全至关重要。本文将结合EasyCVR视频监控的强大功能,为您详细阐述监控系统安装过程中的关键步骤和注意事项,帮助您打造一个高效、可靠的监控解决方案。 一、调试物资准备与…...
Spring Cloud Eureka 与 Nacos 深度解析:从架构到对比
一、Eureka:经典微服务注册中心 (一)核心定位与特性 Spring Cloud Eureka 是 Netflix 开源的服务注册与发现组件,在微服务架构中扮演 "大脑" 角色,负责服务的注册、发现与状态管理。其核心优势在于通过心跳…...
深入详解Java中的@PostConstruct注解:实现简洁而高效初始化操作
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
【Unity笔记】Unity 编辑器扩展:一键查找场景中组件引用关系(含完整源码)(组件引用查找工具实现笔记)
摘要: 本文介绍了如何在 Unity 编辑器中开发一款实用的编辑器扩展工具 —— ComponentReferenceFinder,用于查找场景中对某个自定义组件的引用关系。该工具特别适用于大型项目、多人协作或引入外部插件后,快速定位组件间的耦合关系。 本文从需…...
实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客
实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客 在当今数字化浪潮的冲击下,实体店面临着前所未有的挑战,但小程序的出现为实体店转型新零售带来了新的曙光。先来看一组惊人的数据,据相关统计ÿ…...
Mysql安装与备份配置分析
若之前存有msqyl的数据缓存,建议用以下命令将数据文件删除干净 mysql-server:主程序 mysql:客户端工具 mysql-devel:开发库 mysql-libs:共享库文件 /var/lib/mysql:数据目录 /etc/my.cnf : 主配置文件 …...
Android APP 爬虫操作
工具 夜神模拟器、charles、mitm 等 mitm的使用参考:Mitmproxy对Android进行抓包(真机)_mitmproxy 安卓-CSDN博客 charles的使用参考:【全网最详细】手把手教学Charles抓包工具详细自学教程,完整版安装教程,详细介绍…...
与Ubuntu相关命令
windows将文件传输到Ubuntu 传输文件夹或文件 scp -r 本地文件夹或文件 ubuntu用户名IP地址:要传输到的文件夹路径 例如: scp -r .\04.py gao192.168.248.129:/home/gao 如果传输文件也可以去掉-r 安装软件 sudo apt-get update 更新软件包列表 sudo apt insta…...
Unity常用内置变换矩阵
Unity引擎提供了一系列内置的变换矩阵,这些矩阵在着色器中用于处理物体、摄像机和光照的坐标变换,是游戏开发中不可或缺的工具。它们帮助开发者在顶点着色器和片段着色器中实现坐标转换、光照计算等功能。 主要变换矩阵类型 模型矩阵 (Model Matrix) /…...
算法题-图论
图的表示 207.课程表 127.单词接龙 图的遍历 DFS 递归。。。 200.岛屿数量 239.矩阵中的最长递增路径 BFS 102.二叉树的层序遍历 看到最短,首先想到的是BFS 542.01矩阵 207.课程表 127.单词接龙 拓扑排序 对于一个有向无环图G进行拓扑排序,是将G中…...
Java 8(Ubuntu 18.04.6 LTS)安装笔记
一、前言 本文与【MySQL 8(Ubuntu 18.04.6 LTS)安装笔记】同批次:先搭建数据库,再安装JVM,后面肯定就是部署Web应用了——典型的单机部署,真可谓“麻雀虽小五脏俱全”。 二、准备 (1ÿ…...
unity编辑器的json验证及格式化
UNITY编辑器的json格式化和验证工具资源-CSDN文库https://download.csdn.net/download/qq_38655924/90676188?spm1001.2014.3001.5501 反复去别的网站验证json太麻烦了 用这个工具能方便点 # Unity JSON工具 这是一个Unity编辑器扩展,用于验证、格式化和压缩JSO…...
C语言中小写字母转大写字母
一、题目引入 这一题运行结果是什么? 二、代码分析 在这个代码中 首先 -> 定义了一个字符数组空间内存是80 里面存储的是字符串123abcdEFG*& 接着 -> 定义了一个整型变量j 后面的循环会用到 然后 -> 使用了<stdio.h>中的库函数puts(ch)原样打印…...
深度学习--卷积神经网络调整学习率
文章目录 前言一、学习率1、什么学习率2、什么是调整学习率3、目的 二、调整方法1、有序调整1)有序调整StepLR(等间隔调整学习率)2)有序调整MultiStepLR(多间隔调整学习率)3)有序调整ExponentialLR (指数衰减调整学习率)4)有序调整…...
桥接模式:分离抽象与实现的独立进化
桥接模式:分离抽象与实现的独立进化 一、模式核心:解耦抽象与实现的多层变化 在软件设计中,当抽象(如 “手机品牌”)和实现(如 “操作系统”)都可能独立变化时,使用多层继承会导致…...
配置kafka与spark连接
一、配置kafka 首先进到software目录当中,如下图所示: 安装包上传/解压/重命名/解压过后的目录如下图所示: 修改配置: cd config vi server.properties 全部修改语句如下所示(以node01为样例)࿱…...
WebXR教学 05 项目3 太空飞船小游戏
准备工作 自动创建 package.json 文件 npm init -y 安装Three.js 3D 图形库,安装现代前端构建工具Vite(用于开发/打包) npm install three vite 启动 Vite 开发服务器(推荐)(正式项目开发) …...
【leetcode】3524 求出数组的X值1
题目链接 题目描述 给你一个正整数数组 nums 和一个正整数 k。 你可以对数组执行一次操作:移除不重叠的前缀和后缀(可以为空),留下一个连续非空子数组。 对于每一种留下的子数组,计算: (该子数组的乘积…...
配电室安全用电漏电保护装置的安全用电措施
配电室作为电力分配与控制的关键场所,其安全用电装置的重要性不言而喻。 防触电、防漏电、防火灾、安全防护、保障生命财产; 当用电设备发生短路、过载或漏电等异常时能迅速切断电源,精准定位问题。及时报警,防止触电 在配电室中…...
数据库-基本概述 和 SQL 语言
标题目录 基本概述DB和DBMS关系数据库库与表的概念表库 数据库在项目中的角色如何操作数据库 SQL 语言SQL 分类DDL 语言数据库操作创建数据库查看数据库删除数据库切换数据库 表的操作创建表查看表修改表名删除表修改表结构 DML 语言插入数据修改数据删除数据 基本概述 DB和DB…...
C语言中的递归1.0
一、递归函数概念引入 简单来说就是自己调用自己 递归函数满足的两个条件: 1.每次调用函数本身,必须一次又一次接近最终结果 2.必须有停止条件 二、代码展示 用递归求1到4的和 代码如下 三、代码分析 首先进入main主函数入口 int sum getsum(4); 就这个具体题目来看 我…...
解锁webpack:对html、css、js及图片资源的抽离打包处理
面试被问到webpack,可别只知道说 HtmlWebpackPlugin 了哇。 前期准备 安装依赖 npm init -y npm install webpack webpack-cli --save-dev配置打包命令 // package.json {"scripts": {// ... 其他配置信息"build": "webpack --mode pr…...