当前位置: 首页 > news >正文

websoket 学习笔记

目录

基本概念

工作原理

优势

应用场景

HTTP协议与 webSoket协议之间的对比

消息推送场景

1. 轮询(Polling)

2. 长轮询(Long Polling)

3. 服务器发送事件(Server-Sent Events, SSE)

4. WebSocket

服务端WebSoket

基本介绍

引入依赖

核心API示例

聊天消息demo流程分析

配置类

webSocketConfig(注入ServerEndpoint注解)

GetHttpSessionConfig(存储Session会话对象)

服务类

Server端Socket

客户端


WebSocket 是一种基于 TCP 的网络通信协议,允许在客户端和服务器之间建立持久的双向通信连接。

基本概念

  • 全双工通信(Full Duplex):WebSocket 支持客户端和服务器在同一连接上同时发送和接收数据,允许数据在两个方向上同时传输。

  • 半双工(Half Duplex):允许数据在两个方向上传输,但是同一个时间段内只允许一个方向上传输。

  • 持久连接:通过一次握手建立连接后,连接会一直保持,无需每次通信都重新建立

  • 低延迟与高效性:减少了传统 HTTP 请求-响应模式中的频繁连接开销,数据传输更高效

工作原理

  1. 握手阶段:客户端通过 HTTP 请求向服务器发起 WebSocket 升级请求,服务器响应后将连接升级为 WebSocket

  • 数据传输:连接建立后,数据以帧的形式在客户端和服务器之间传输

  • 关闭连接:当一方关闭连接时,WebSocket 会发送关闭帧,通知对方关闭连接

优势

  • 实时性:适合需要快速响应和更新的场景

  • 节省资源:减少了不必要的网络请求和响应,降低了带宽和服务器资源消耗

  • 跨平台支持:主流浏览器和服务器端语言均支持 WebSocket

应用场景

  • 实时通信:如在线聊天、实时游戏

  • 数据推送:服务器主动向客户端推送数据,如股票行情、天气预报

  • 实时监控:如视频监控、设备状态监控

        WebSocket 是现代 Web 开发中实现高效实时通信的重要技术,广泛应用于各种需要快速数据交互的场景。

HTTP协议与 webSoket协议之间的对比

        用到最多的其中一个场景就是 消息推送。

消息推送场景

消息推送是指服务器主动向客户端发送信息的技术。以下是几种常见的消息推送方式:

1. 轮询(Polling)

  • 原理:客户端每隔固定时间向服务器发送请求,查询是否有新消息。

  • 优点

    • 实现简单,兼容性好,不需要额外的服务器支持。

  • 缺点

    • 频繁请求会增加服务器负担,浪费带宽。

    • 实时性较差,消息延迟取决于轮询间隔。

  • 适用场景:对实时性要求不高的场景,如邮件通知。

2. 长轮询(Long Polling)

  • 原理:客户端向服务器发送请求,服务器保持连接打开,直到有新消息才返回响应。

  • 优点

    • 减少了无效请求,相比普通轮询更节省资源。

    • 实时性更好。

  • 缺点

    • 服务器需要保持大量连接,对服务器资源要求较高。

    • 如果消息间隔过长,可能导致连接超时。

  • 适用场景:对实时性有一定要求但不希望使用复杂技术的场景。

3. 服务器发送事件(Server-Sent Events, SSE)

原理

  • 服务器通过 HTTP 连接向客户端推送数据,客户端通过 EventSource 接收消息。

  • SSE在服务器和客户端之间打开一个单向通道

  • 服务端响应的不再是一次性的数据包,而是text/event-stream类型的数据流信息

  • 服务器有数据变更时将数据流式传输到客户端

优点

  • 实现简单,基于 HTTP,兼容性较好。

  • 只支持单向通信(服务器到客户端),适合通知类应用。

缺点

  • 不支持双向通信。

  • 不支持跨域,需要服务器和客户端在同一个域下。

适用场景:股票行情、新闻推送等单向通知场景。

4. WebSocket

  • 原理:通过一次握手建立持久的双向通信连接,客户端和服务器可以随时发送和接收消息。

  • 优点

    • 全双工通信,实时性高。

    • 数据传输效率高,减少了 HTTP 请求的开销。

  • 缺点

    • 实现复杂,需要服务器和客户端都支持 WebSocket 协议。

    • 需要额外处理连接的建立和关闭。

  • 适用场景:在线聊天、实时游戏、实时协作工具等。

不同消息推送方式各有优缺点,选择时需要根据具体需求和场景进行权衡。例如:

  • 如果对实时性要求不高,可以选择轮询或长轮询。

  • 如果需要高效实时的双向通信,WebSocket 是更好的选择。

服务端WebSoket

基本介绍

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

核心API示例

聊天消息demo流程分析

配置类

webSocketConfig(注入ServerEndpoint注解)

package com.angindem.server.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {@Bean
//    注入ServerEndpointExporter,自动注册使用@ServerEndpoint注解的public ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

GetHttpSessionConfig(存储Session会话对象)

package com.angindem.server.config;import com.angindem.common.utils.CommonUtils;
import com.angindem.common.utils.IpUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import jakarta.websocket.HandshakeResponse;
import jakarta.websocket.server.HandshakeRequest;
import jakarta.websocket.server.ServerEndpointConfig;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;public class GetHttpSessionConfig extends ServerEndpointConfig.Configurator {@Overridepublic void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
//         获取 HttpSession 对象HttpSession httpSession = (HttpSession) request.getHttpSession();// 获取当前请求的HttpServletRequestServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest req = attributes.getRequest();if (httpSession == null) httpSession = req.getSession();String ip = IpUtils.getIpAddress(req);httpSession.setAttribute("user", CommonUtils.getRandomString(8));//        将 HttpSession 对象存储到 ServerEndpointConfig 中sec.getUserProperties().put(HttpSession.class.getName(), httpSession);// 将HttpServletRequest存储到EndpointConfig的用户属性中sec.getUserProperties().put(String.class.getName(), ip);}
}

服务类

Server端Socket

package com.angindem.server.wx;
import com.alibaba.fastjson2.JSON;
import com.angindem.common.utils.MessageUtils;
import com.angindem.server.config.GetHttpSessionConfig;
import com.angindem.server.wx.pojo.Message;
import jakarta.servlet.http.HttpSession;
import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
@ServerEndpoint(value = "/chat", configurator = GetHttpSessionConfig.class)
public class ChatEndPoint {//    ConcurrentHashMap 高并发的多线程访问的哈希Mappublic static final Map<String, Session> onlineUsers = new ConcurrentHashMap<>();private HttpSession httpSession;@OnOpenpublic void onOpen(Session session, EndpointConfig config) {log.info("连接建立成功");
//        1、将 Session 放入到集合中,方便后续使用this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());String  reqIp = (String) config.getUserProperties().get(String.class.getName());String user =  MessageUtils.getNowSessionUserName(this.httpSession);onlineUsers.put(user, session);
//        2、广播消息。需要将登录的所有用户推送给所有用户log.info("当前在线人数:{}", onlineUsers.size());log.info("当前用户:{},来自:{}", user, reqIp);String message = MessageUtils.getDataMessage("system", user, MessageUtils.getFrinds());MessageUtils.broadcastAllUsers(message);}@OnMessagepublic void onMessage(String message) {log.info("收到消息:{}", message);Message msg = JSON.parseObject(message, Message.class);// 获取 消息接收方的用户名String toName = msg.getToName();String mess = msg.getMessage();String user =  MessageUtils.getNowSessionUserName(this.httpSession);String sendMessage = MessageUtils.getMessage("user", user, mess);// 获取消息接收方用户对象的 session 对象
//            Session session = onlineUsers.get(toName);
//            session.getBasicRemote().sendText(sendMessage);MessageUtils.broadcastAllUsers(sendMessage);}@OnClosepublic void onClose(Session session) {log.info("连接关闭");
//        1、从 onlineUsers 中剔除当前的 session 对象String user =  MessageUtils.getNowSessionUserName(this.httpSession);onlineUsers.remove(user);
//        2、通知其它所有的用户,当前用户已经下线log.info("当前在线人数:{}", onlineUsers.size());String message = MessageUtils.getDataMessage("system", user, MessageUtils.getFrinds());MessageUtils.broadcastAllUsers(message);}
}

客户端

(VueUse的  webSocket 客户端)

/*** status 是连接的状态值* data 是 socket 推送过来的消息* send 是一个方法, 用来发送消息给后台* close 是一个方法,关闭 socket 连接* open 如果当前的websocket是活跃的,将会关闭它重新打开一个新的*/
const { status, data, close, open, send } = useWebSocket(`ws://localhost:9898/chat`, {onConnected: function (ws) {console.log('websocket 连接成功!', ws)},onDisconnected: function (ws, event) {console.log('onDisconnected')},onError: function (ws, event) {console.log('onError', event)},onMessage: function (ws, event) {console.log('event.data', event.data)if (event.data) {// messageInfo.value = []const info = JSON.parse(event.data)console.log(info) // 这里就是websocket每次发送的消息if (info.data) updateUsers(info.data);if (info.message) messageInfo.value.push(info)}},heartbeat: false,autoClose: false, // 自动关闭连接});

扩展:

同时可以通过 vue 中的 watch 监听发送过来的数据


import {  watch } from 'vue';
//获取数据时必须要监视,此处的data就是上面结构出的data
watch(data, () => {//获取到的数据为data.valueconsole.log(data.value)
})

发送消息到服务端

//需要发送给服务器的数据
const info = "你好吗?"//send方法,此处的send为上面解构出的send
send(info)

相关文章:

websoket 学习笔记

目录 基本概念 工作原理 优势 应用场景 HTTP协议与 webSoket协议之间的对比 消息推送场景 1. 轮询&#xff08;Polling&#xff09; 2. 长轮询&#xff08;Long Polling&#xff09; 3. 服务器发送事件&#xff08;Server-Sent Events, SSE&#xff09; 4. WebSocket…...

正版金币捕鱼海洋管家APP源码结构解析与运行环境说明

这是一款基于成熟运营逻辑开发的休闲类互动娱乐游戏《海洋管家》&#xff0c;采用金币流通体系&#xff0c;双端源码完整&#xff0c;结构清晰&#xff0c;适合用于结构学习、本地部署测试或功能参考。 整体玩法围绕捕鱼为主线&#xff0c;并融合了排行榜、VIP、签到、道具商城…...

大语言模型深度思考与交互增强

总则&#xff1a;深度智能交互的全面升级 在主流大语言模型&#xff08;LLM&#xff09;与用户的每一次交互中&#xff0c;模型需于回应或调用工具前&#xff0c;展开深度、自然且无过滤的思考进程。当模型判断思考有助于提升回复质量时&#xff0c;必须即时进行全方位的思考与…...

Vue.js 项目中 vue.config.js 常用配置项解析

Vue.js 项目中 vue.config.js 常用配置项解析 摘要 在 Vue CLI 创建的项目中&#xff0c;vue.config.js 是核心配置文件&#xff0c;用于定制化构建、开发和部署流程。本文详细解析了该文件的常用配置项&#xff0c;包括基础路径、开发服务器、Webpack 配置、CSS 预处理、插件…...

Javascript逗号操作符

这段代码是一个使用了生成器函数&#xff08;Generator Function&#xff09;的无限循环&#xff08;for (;;)&#xff09;&#xff0c;内部通过switch语句控制流程。代码中有很多逗号分隔的语句&#xff0c;这其实是利用了JavaScript的逗号操作符&#xff08;comma operator&a…...

windows系统安装驱动、cuda和cudnn

一、首先在自己的电脑里安装了nvidia的独立显卡 显卡的查找方式&#xff1a; CtrlShiftEsc打开任务管理器&#xff0c;点击性能&#xff0c;点击GPU 0查看显卡型号&#xff0c;如下图所示&#xff1a; 只要电脑中有nvidia的独立显卡&#xff0c;就可以暗转显卡驱动、cuda和cu…...

常见的 14 个 HTTP 状态码详解

文章目录 一、2xx 成功1、200 OK2、204 No Content3、206 Partial Content 二、3xx 重定向1、301 Moved Permanently2、302 Found3、303 See Other注意4、Not Modified5、307 Temporary Redirect 三、4xx 客户端错误1、400 Bad Request2、401 Unauthorized3、403 Forbidden4、4…...

DAY 44 leetcode 28--字符串.实现strStr()

题号28 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 我的解法 双指针&#xff0c;slow定位&…...

Nginx用途以及好处:

反向代理&#xff1a; 1、提高访问速度 2、进行负载均衡&#xff1a;所谓负载均衡&#xff0c;就是把大量的请求按照我们指定的的方式均衡的分配给集群中的每台服务器(不使用nginx前端会固定的访问某一台服务器 加入nginx分配到多台服务器) 3、保证后端的安全 服务器一般部署在…...

打造可控可测的星座网络:IPLOOK低轨通信仿真平台搭建实践

在低轨卫星通信迅猛发展的趋势下&#xff0c;空天地一体化网络正逐步成为新一代信息基础设施的核心组成。作为移动核心网领域的技术引领者&#xff0c;IPLOOK依托在5G核心网、NTN&#xff08;非地面网络&#xff09;和卫星通信仿真方面的技术优势&#xff0c;率先构建了自主可控…...

火车头采集动态加载Ajax数据(无分页瀑布流网站)

为了先填充好数据在上线&#xff0c;在本地搭建了一个网站&#xff0c;并用火车头采集数据填充到里面。 开始很上手&#xff0c;因为找的网站的分类中是有分页的。很快捷的找到页面标识。 但是问题来了&#xff0c;如今很多网站都是采用的Ajax加载数据&#xff0c;根本没有分…...

笔记:代码随想录算法训练营day67:Floyd 算法精讲、A * 算法精讲 (A star算法) 严重超时完结,不过,撒花

学习资料&#xff1a;代码随想录 Floyd 算法精讲 卡码网&#xff1a;97. 小明逛公园 首先明确floyd算法解决的是多源最短路径问题&#xff0c;对边的权的正负值没有要求&#xff0c;而且是动态规划的思想 五部曲&#xff1a; 定义&#xff1a;grid[i][j][k]表示从i出发到j…...

Electron Forge【实战】桌面应用 —— AI聊天(中)

系列教程 Electron Forge【实战】桌面应用 —— AI聊天&#xff08;上&#xff09; 添加本地存储 Dexie.js 用 IndexedDB 实现&#xff0c;Dexie.js 库简化操作 npm i dexie新建文件 src\db.ts import Dexie, { type EntityTable } from "dexie";import { Provide…...

国达陶瓷重磅推出陶瓷罗马柱外墙整装尖端新产品“冠岩臻石”

近日&#xff0c;记者在佛山国达建材有限公司&#xff08;以下简称国达陶瓷&#xff09;董事长杨建平处了解到&#xff0c;该公司重磅推出的“冠岩臻石”新产品&#xff0c;是属于陶瓷罗马柱外墙整装产品中的尖端产品。新产品自面市之后&#xff0c;深受高端用户的青睐与认可。…...

Java 系统设计:如何应对高并发场景?

Java 系统设计&#xff1a;如何应对高并发场景&#xff1f; 在现代互联网应用中&#xff0c;高并发场景已经成为系统设计中不可避免的挑战。无论是电商秒杀、抢票系统&#xff0c;还是实时数据处理平台&#xff0c;高并发场景都对系统的性能、稳定性和扩展性提出了极高的要求。…...

VR 全景多维赋能,众趣科技助力零售业开启购物新时代

说到商铺这个词&#xff0c;最早形成于春秋战国时期&#xff0c;当时还未形成固定位置的商铺&#xff0c;部分有远见的商人会在人流量较大的区域摆设摊位&#xff0c;促进了城市的繁荣‌。‌到了唐宋时期&#xff0c;商铺进一步发展‌&#xff0c;并随着商品经济的发展和城市人…...

五大生产模式(MTS、MTO、ATO、ETO、CTO)的差异

五大生产模式&#xff08;MTS、MTO、ATO、ETO、CTO&#xff09;差异 一、 库存控制二、 订货提前期三、交期与库存分析四、五大生产模式的产品生命周期 一、 库存控制 ETO 模式侧重于原材料库存管理&#xff0c;以应对定制设计所需的物料供应。 MTO 模式重点是原材料库存&…...

clickhosue中json字符串转为表

将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 -- 将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 WITH -- 解析 JSON 数据为字符串json_data AS (SELECT [{"c…...

二叉树的基本功能实现

一.二叉树的结构及实现 1.二叉树的结构 在之前的章节中已经介绍过&#xff0c;二叉树是一种特殊的树&#xff0c;其最大度为2&#xff0c;及最多有左&#xff0c;右两个孩子&#xff0c;结构图如下 在此之前已经讨论过一些特殊的二叉树&#xff0c;这里讨论一般的二叉树 2.…...

VSCode 降低适用版本并且关闭自动更新

VSCode 降低适用版本并且关闭自动更新 相关链接问题描述解决方法下载安装包关闭自动更新 参考链接 相关链接 VSCode 官网 问题描述 无法正常使用vscode-remote插件远程连接Centos7等一些老版本Linux云服务器&#xff08;如Centos7&#xff09; 从2024年1月&#xff0c;vsco…...

OpenHarmony - 小型系统内核(LiteOS-A)(二)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;二&#xff09; 三、基础内核 3.1、中断及异常处理 基本概念 中断是指出现需要时&#xff0c;CPU暂停执行当前程序&#xff0c;转而执行新程序的过程。即在程序运行过程中&#xff0c;出现了一个必须…...

2025第十六届蓝桥杯PythonA组部分题解

试题A&#xff1a;数字求和 题目描述 给定两个整数a和b&#xff0c;输出它们的和。 输入格式&#xff1a;两个整数&#xff0c;空格分隔 输出格式&#xff1a;一个整数 输入输出样例 输入&#xff1a; 5 8输出&#xff1a; 13解题思路 直接使用加法运算符计算两数之和。…...

苍穹外卖day04

Spring Task实现定时处理订单状态 作用&#xff1a;不需要输入提示信号&#xff0c;便可定时自动执行程序 使用步骤 1、启动类上加上注解&#xff08;EnableScheduling&#xff09;开启定时任务调度 2、专门创建一个包来管理执行定时任务的类&#xff0c;该类需要交给IOC容…...

曲线与曲面的绘制

一、学习目标 &#xff08;1&#xff09;掌握常用规则参数曲线与曲面的编程绘制方法。 &#xff08;2&#xff09;掌握自由曲线与曲面的编程绘制方法。 &#xff08;3&#xff09;了解自由曲面的拼接编程方法。 二、学习内容 &#xff08;1&#xff09;编程绘一个规则参数…...

Python Cookbook-6.2 定义常量

任务 你需要定义一些模块级别的变量(比如命名的常量)&#xff0c;而且客户代码无法将其重新绑定。 解决方案 你可以把任何对象当做模块一样安装。将下列代码存为一个模块const.py&#xff0c;并放入你的Python的sys.path 指定的目录中: class _const(object):class ConstEr…...

【信息系统项目管理师】高分论文:论信息系统项目的范围管理(信息化系统综合管理平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划范围管理2、收集需求3、定义范围4、创建WBS5、确认范围6、控制范围论文 2017年6月,我作为项目经理参与了 XX市经济和信息化委员会系统综合管理平台建设项目,该项目投资共150万元人民币,建设工期…...

用Webpack 基础配置快速搭建项目开发环境

Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具&#xff0c;但是Webpack有大量的配置项&#xff0c;对新手不太友好&#xff0c;但是我们可以根据webpack-cli的init命令根据项目需求快速生成webpack的配置文件&#xff0c;本文将手把手教你如何用 Webpack 和 npm 快…...

【LLM Agent】SystemMessage 和 HumanMessage

文章目录 SystemMessage 和 HumanMessageSystemMessage&#xff08;系统消息&#xff09;HumanMessage&#xff08;用户消息&#xff09;结合使用高级设置能否将用户消息&#xff08;HumanMessage&#xff09;写在系统消息&#xff08;SystemMessage&#xff09; SystemMessage…...

机器学习核心知识:从基础概念到关键算法

摘要 本文深度剖析机器学习知识体系&#xff0c;从基本概念、学习方式&#xff0c;到分类算法、逻辑回归等关键内容均有涉及。详细阐述各知识点原理与应用场景&#xff0c;并对比多种算法的优劣。 关键词&#xff1a;机器学习&#xff1b;监督学习&#xff1b;分类算法&#x…...

信奥赛之c++基础(for与if的嵌套使用)

🍭 糖果工厂大闯关——for与if的嵌套魔法 🚚 第一章:快递站的故事(情景引入) 📦 快递分拣员小明 快递站每天要处理100个包裹,小明发现: 有些包裹要立即派送(红色标签)有些包裹可以暂存仓库(蓝色标签)for (int 包裹号=1; 包裹号<=100; 包裹号++) {if (包裹颜…...

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日&#xff0c;备受瞩目的QCon开发者技术峰会盛大举行&#xff0c;本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题&#xff0c;汇聚了众多鸿蒙生态的领军人物与技术专家&#xff0c;共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…...

day25 学习笔记

文章目录 前言一、图像翻转二、图像的仿射变换1.仿射变换的原理2.仿射变换函数3.图像旋转4.图像平移5.图像缩放6.图像剪切 三、插值方法1.最近领插值2.双线性插值法3.双三次插值4.代码展示 前言 通过今天的学习&#xff0c;我掌握了OpenCV中有关图像翻转&#xff0c;图像仿射变…...

Docker构建go-web应用

https://www.liwenzhou.com/posts/Go/deploy-in-docker/#c-0-4-0 本文介绍了如何使用Docker以及Docker Compose部署我们的 Go Web 程序。 Docker部署示例 准备代码 这里我先用一段使用net/http库编写的简单代码为例讲解如何使用Docker进行部署&#xff0c;后面再讲解稍微复杂…...

人工智能100问☞第4问:人工智能与机器学习、深度学习的区别?

目录 一、通俗解释 二、专业解析 三、权威参考 人工智能(AI)是目标​​:让机器具备智能(如建造一辆车);机器学习(ML)是引擎​​:提供动力方法(如燃油发动机);深度学习(DL)是涡轮增压​​:提升引擎性能(如处理复杂路况)。三者协同驱动技术发展,如同车辆需要…...

电子电器架构 --- 智能座舱的定义

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

JavaScript Map 对象深度解剖

JavaScript Map 对象深度解剖 一、Map 核心特性 1.1 什么是 Map&#xff1f; 通俗解释&#xff1a; Map 就像是一个“超级版对象”&#xff0c;它用更灵活的方式存储键值对。举个生活例子&#xff1a; 普通对象&#xff08;Object&#xff09;像一本传统电话簿&#xff0c;…...

zlm启用webrtc交叉编译指南

zlm启用webrtc交叉编译指南 一、交叉编译openssl 下载openssl-1.1.1k版本&#xff0c;其他版本可能会有问题 $ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz $ tar -xvzf openssl-1.1.1k.tar.gz $ cd openssl-1.1.1k $ ./config no-asm shared --openssld…...

树莓派超全系列教程文档--(23)内核参数

内核参数 内核命令行 (cmdline.txt)命令行选项标准条目设置KMS显示模式 其他条目 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 内核命令行 (cmdline.txt) Linux 内核在启动过程中接受一系列命令行参数。在 Raspberry Pi 上&#xff0c;该命令…...

机器学习 从入门到精通 day_05

1. 线性回归 前面介绍了很多分类算法&#xff0c;分类的目标变量是标称型数据&#xff0c;回归是对连续型的数据做出预测。 标称型数据&#xff08;Nominal Data&#xff09;是统计学和数据分析中的一种数据类型&#xff0c;它用于分类或标记不同的类别或组别,数据点之间并没有…...

读者、写者问题优化

#include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define NUM_READERS 5 #define NUM_WRITERS 5 // 定义信号量和全局变量 sem_t sdata, srcount; int rea…...

DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析

DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析 DeepSeek作为中国人工智能领域的重要参与者&#xff0c;推出了V3和R1两款大模型&#xff0c;它们在架构设计和应用场景上各有侧重。本文将深入分析这两款模型在架构原理上的核心差异&#xff0c;并探讨它们如何分别应对复杂推…...

OpenCV图像增强实战教程:从理论到代码实现

OpenCV图像增强实战教程&#xff1a;从理论到代码实现 &#x1f525;&#x1f680; &#x1f4da; 想要掌握图像增强的核心技术&#xff1f;本文手把手教你使用OpenCV实现多种图像增强技术&#xff0c;从基础的线性变换到高级的频域滤波&#xff0c;全方位提升你的图像处理能力…...

一文介绍关于多模态的基础知识 !!

文章目录 前言 一、机器学习 二、深度学习 三、应用领域 前言 多模态不再局限于单一类型的数据处理&#xff0c;它融合图像、文本和音频等多种信息源。其基础知识涵盖机器学习、深度学习及其在多模态领域的应用。机器学习部分包含分类、回归、聚类和降维等四类算法&#xff1b…...

mysql DQL

一.基本查询 1.查询多个字段 2.查看所有字段 3.设置别名 4.去除重复记录 二.条件查询 1.大于小于等于 2.查询 身份证为空的 没有所以没有记录 3.在15到20这个区间范围内 4.or/in 或者 4.like 匹配 &#xff08;_匹配单个字符 %匹配多个字符&#xff09; 查询员工信…...

Android Studio 项目文件夹结构详解

文章目录 一、项目视图概览1. Android 视图&#xff08;简化视图&#xff09;2. Project 视图&#xff08;完整物理结构&#xff09; 二、核心目录详解1. 项目根目录文件2. app 模块目录&#xff08;主模块&#xff09;2.1 manifests/2.2 java/2.3 res/ - 资源目录2.4 assets/2…...

Linux系统常见磁盘扩容操作(Common Disk Expansion Operations in Linux Systems)

Linux系统常见磁盘扩容操作 目录说明 一、准备工作&#xff1a;获取目标磁盘信息 &#xff08;1&#xff09;确认分区表格式和文件系统 二、扩容已有MBR分区 &#xff08;1&#xff09;分区后扩容 ext为例 xfs为例 三、扩容已有GPT分区 &#xff08;1&#xff09;分区…...

【UE5 C++】“ProceduralMeshComponent”的使用记录

效果 如下所示&#xff0c;通过“ProceduralMeshComponent”创建了一个自定义形状的Mesh&#xff0c;并且该Mesh包含碰撞信息&#xff0c;然后2s后更新Mesh形状。 步骤 1. 在“xxx.Build.cs”中引入“ProceduralMeshComponent”模块 2. 新建一个Actor类&#xff0c;这里命名为…...

源代码加密之零日攻击

# SDC沙盒&#xff1a;有效防御零日攻击的多层防护体系 在当今复杂多变的网络安全环境中&#xff0c;零日攻击已成为企业面临的重大威胁之一。零日攻击利用尚未被公众发现或尚未被软件供应商修复的漏洞进行攻击&#xff0c;具有极高的隐蔽性和破坏性。SDC沙盒作为一种先进的数…...

Vue2 集成VTK.js 并显示3D影像

Vue2 集成VTK.js 并显示3D影像&#xff08;核心代码) 作者:coder_fang vtk.js目前官网只有vue3的示例&#xff0c;对于已有vue2系统的集成&#xff0c;需要使用指定版本的vtk,itk等库并修改部分配置即可。 需要的主要库和版本: vue:2.3.4; vtk-v32.9.0.min.js,itk-wasm.min.…...

本地git操作

一、初始化与基础操作 1. 初始化仓库 git init # 当前目录新建仓库 git init <目录名> # 指定目录初始化 2. 查看状态 git status # 显示工作区和暂存区状态 git status -s # 简洁版状…...