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

SignalR给特定User发送消息

1、背景

官网上SignalRdemo很详细,但是有个特别的问题,就是没有详细阐述如何给指定的用户发送消息。

2、解决思路

网上整体解决思路有三个:
1、最简单的方案,客户端连接SignalR的Hub时,只是简单的连接,不包含用户信息。连接完成后,发送一个指定格式的数据包,里面包含用户信息,服务器收到后,完成解析,并将用户信息与connectionID关联起来,用于保存(保存在List或者数据库中均可,看具体应用)。网上这个方案比较多
2、使用Group方案。这个是一个比较取巧的方案,将用户信息放在Group,然后通过Group找到用户,并发送信息。
3、使用用户认证方案。一般有cookie方案和token方案。

因为token方案比较常见,在客户端和网页端都可以使用,所以本篇阐述如何通过用户认证方案(JWT方式),实现SignalR给指定的用户发送消息的功能

3、具体实现

3.1 基本原理

在这里插入图片描述
整体步骤如下:
1、根据API的方法要求,传入用户名、密码
2、认证服务器,将返回一个JWT格式的Token。这儿有个关键,就是第二段(payload)。可以进行自定义。例如:

//payload中的值设定
private static ClaimsIdentity GenerateClaims(User user)
{var ci = new ClaimsIdentity();ci.AddClaim(new Claim("id", user.Id.ToString()));ci.AddClaim(new Claim(ClaimTypes.Name, user.Username));ci.AddClaim(new Claim(ClaimTypes.GivenName, user.Name));ci.AddClaim(new Claim(ClaimTypes.Email, user.Email));ci.AddClaim(new Claim("EmployeeID", user.EmployeeID));foreach (var role in user.Roles)ci.AddClaim(new Claim(ClaimTypes.Role, role));return ci;
}

因此获得的token后,解析payload,就会得到如下的信息。而我们一会儿要用的,就是这些信息。
在这里插入图片描述
3、第三步是在SignalR服务器,自定义识别user方法。代码如下:

public class CustomUserIDProvider : IUserIdProvider
{public string? GetUserId(HubConnectionContext connection){var returnStr = connection.User?.FindFirst("EmployeeID")?.Value!;return returnStr;}
}

我们希望使用员工号(EmployeeID)进行唯一的识别,因此在第二步中,添加了EmployeeID的自定义Claim
这一步的核心就是,当客户端发起一个SignalR连接时,会一并第2步的token,SignalR中默认会关联connection和userID,而第三步就是确定,用哪个信息能够代表唯一的userID(既方便系统识别,又符合业务逻辑,在本例中,我们使用了员工号)。
实现上述CustomUserIDProvider后,在Program中注册,替换SignalR的默认provider。

builder.Services.AddSingleton<IUserIdProvider, CustomUserIDProvider>();

4、第四步是定义连接,并使用StartAsync()方法,进行连接。

var _token="eyJhbGciOiJIUzI1NiIsInR.XXXXXXX.YYYYYYYYYY";//本人使用Android模拟机发起一个SignalR请求
//虽然SignalR服务器在本机电脑上,但Android虚拟机中不能使用localhost,因为会被系统认为是访问Android虚拟机
//本机的地址,在Android虚拟机的对应地址,可以通过adb进行查看
//一般情况是10.0.0.2、10.0.2.2等,但不是绝对的,可以查看相关的配置
connection = new HubConnectionBuilder().WithUrl("http://10.0.2.2:5261/signalrtc", options =>{options.AccessTokenProvider = () => Task.FromResult(_token);}).WithAutomaticReconnect().Build();
//Android终端,收到消息后,在界面上进行追加展示
connection.On<string>("ReceiveMessage", (message) =>
{this.RunOnUiThread(() =>{showTextView.Text += message + " ";});});

在某个事件中触发StartAsync()方法,实现连接。

private async void FabOnClickAsync(object sender, EventArgs eventArgs)
{try{await connection.StartAsync();}catch (Exception ex){this.RunOnUiThread(() => {showTextView.Text = ex.Message;});}
}

这儿有个关键信息

In the .NET Client, this access token is passed in as an HTTP “Bearer Authentication” token (Using the Authorization header with a type of Bearer). In the JavaScript client, the access token is used as a Bearer token, except in a few cases where browser APIs restrict the ability to apply headers (specifically, in Server-Sent Events and WebSockets requests). In these cases, the access token is provided as a query string value access_token.

就是在正常情况下,不管是.NET客户端还是在JavaScript端,发送的token信息,都会包到header信息中(header中,key是Authorization,value是"Bearer token的具体值"),只有特殊情况,token会追加到查询字符串中,以access_token的样式,例如:http://xxxxx?access_token=xxxxxx。

而官网上具体例子:

builder.Services.AddAuthentication(options =>
{// Identity made Cookie authentication the default.// However, we want JWT Bearer Auth to be the default.options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>{// Sending the access token in the query string is required when using WebSockets or ServerSentEvents// due to a limitation in Browser APIs. We restrict it to only calls to the// SignalR hub in this code.// See https://docs.microsoft.com/aspnet/core/signalr/security#access-token-logging// for more information about security considerations when using// the query string to transmit the access token.options.Events = new JwtBearerEvents{OnMessageReceived = context =>{//【就是这里】,浏览器的方式是可以通过http:xxxxx?access_token=xxx实现的,但是在//NET客户端中,一直在Header中,因此如果使用客户端连接,则下面的accessToken肯定会一直为nullvar accessToken = context.Request.Query["access_token"];// If the request is for our hub...var path = context.HttpContext.Request.Path;if (!string.IsNullOrEmpty(accessToken) &&(path.StartsWithSegments("/hubs/chat"))){// Read the token out of the query stringcontext.Token = accessToken;}return Task.CompletedTask;}};});

我们可以通过断点追踪查看,当客户端发起SignalR请求时,routevalues中没有access_token的值,如下图所示。
在这里插入图片描述
而token信息,是一直在headers中,如下图所示:
在这里插入图片描述因此在SignalR服务器中,获取token的方式应该如下:

options.Events = new JwtBearerEvents
{OnMessageReceived = context =>{if (context.Request.Query.ContainsKey("access_token")){context.Token = context.Request.Query["access_token"];}else if (context.Request.Headers.TryGetValue("Authorization", out var value) && value.Count > 0){context.Token = value[0].Substring("Bearer ".Length);}return Task.CompletedTask;}
};

这样,就能够实现token值的获取了。

3.2 实现效果

在这里插入图片描述

3.2.1 推送的代码

上面的例子中,通过controller方法,进行了推送

[ApiController]
public class HubPushController : ControllerBase
{private readonly IHubContext<SignalRTCHub> _hubContext;public HubPushController(IHubContext<SignalRTCHub> hubContext){_hubContext = hubContext;}//这个是指定用户进行推送[HttpGet]public async Task SendMessageByEmail(string employeeid, string message){await _hubContext.Clients.User(employeeid).SendAsync("ReceiveMessage",message);}//这个是全部用户的推送[HttpGet]public async Task SendMessageToAll(string message)=> await _hubContext.Clients.All.SendAsync("ReceiveMessage", message);
}

4、参考资料

1、ASP.NET Core SignalR configuration
2、SignalR AccessTokenProvider works with TypeScript client but not .NET client

相关文章:

SignalR给特定User发送消息

1、背景 官网上SignalR的demo很详细&#xff0c;但是有个特别的问题&#xff0c;就是没有详细阐述如何给指定的用户发送消息。 2、解决思路 网上整体解决思路有三个&#xff1a; 1、最简单的方案&#xff0c;客户端连接SignalR的Hub时&#xff0c;只是简单的连接&#xff0c…...

新浪财经股票每天10点自动爬取

老规矩还是先分好三步&#xff0c;获取数据&#xff0c;解析数据&#xff0c;存储数据 因为股票是实时的&#xff0c;所以要加个cookie值&#xff0c;最好分线程或者爬取数据时等待爬取&#xff0c;不然会封ip 废话不多数&#xff0c;直接上代码 import matplotlib import r…...

【CSP】202403-1词频统计

文章目录 算法思路1. 数据结构选择2. 输入处理3. 统计出现的文章数4. 输出结果 代码示例代码优化 样例输入 4 3 5 1 2 3 2 1 1 1 3 2 2 2 2 3 2样例输出 2 3 3 6 2 2算法思路 1. 数据结构选择 vector<int>&#xff1a;用于存储每篇文章的单词列表&#xff08;可能包含…...

CentOs系统部署DNS服务

1. 安装 Bind 软件包 首先需要安装bind以及相关的工具包&#xff0c;在终端中执行以下命令&#xff1a; bash sudo yum install bind bind-utils -y2. 配置主配置文件 Bind 的主配置文件是/etc/named.conf&#xff0c;你可以使用文本编辑器&#xff08;如vim&#xff09;打开…...

LintCode第974题-求矩阵各节点的最短路径(以0为标准)

描述 给定一个由0和1组成的矩阵&#xff0c;求每个单元格最近的0的距离。 两个相邻细胞之间的距离是1。 给定矩阵的元素数不超过10,000。 在给定的矩阵中至少有一个0。 单元格在四个方向上相邻:上&#xff0c;下&#xff0c;左和右。 样例 例1: 输入: [[0,0,0],[0,0,0],[0…...

吴恩达深度学习复盘(6)神经网络的矢量化原理

矢量化基础是线性运算&#xff0c;这里先简单复习一下。线性基本运算基本没什么&#xff0c;大量使用的有点乘和叉乘。 基本例子 1. 矩阵的基本概念 - 矩阵可以看作是一个块或者二维数组&#xff0c;这是对矩阵的一个在计算机计算的直观描述。 2. 向量的点积&#xff08;内积…...

ISIS多区域配置

一、什么是ISIS多区域 ISIS&#xff08;Intermediate System to Intermediate System&#xff09;多区域是指网络被划分为多个逻辑区域&#xff08;Areas&#xff09;&#xff0c;不同区域之间通过特定的ISIS路由器&#xff08;Level-1-2&#xff09;进行路由交互。多区域设计提…...

The emulator process for AVD xxx has terminated

问题描述 离线环境下部署Android虚拟机&#xff0c;启动时报错The emulator process for AVD xxx has terminated&#xff0c;其中xxx为虚拟机名称。 解决过程 可先在C:\Users\admin\AppData\Local\Google\AndroidStudio2024.3\log目录下找到idea.log文件&#xff0c;其中记录…...

Haskell语言的区块链扩展性

Haskell语言的区块链扩展性研究 引言 区块链技术近年来在金融、供应链、物联网等多个领域取得了显著的进展。作为一种分布式账本技术&#xff0c;区块链的核心在于其去中心化、不可篡改和透明性。然而&#xff0c;随着应用的不断深入&#xff0c;区块链面临着可扩展性、性能、…...

第11/100节:三点估算

第11/100节&#xff1a;三点估算 三、完成某信息系统集成项目中的一个最基本的工作单元 A 所需的时间&#xff0c;乐观的估计需 8 天&#xff0c;悲观的估计需 38天&#xff0c;最可能的估计需 20 天&#xff0c;按照三点估算方法进行估算&#xff0c;项目的工期应该为&#xf…...

Tourists

一道圆方树恶心题&#xff0c;*3200&#xff0c;不知道为什么不评黑。 这道题很容易直接想到圆方树&#xff1a;因为两个操作如果在树上&#xff0c;都需要树链剖分 线段树维护。而将这么一个普通图转化为一棵树&#xff0c;也就只有圆方树这种形式了。 于是就可以综合使用圆…...

【动态规划】深入动态规划:连续子结构的算法剖析

文章目录 前言例题一、最大子数组和二、环形子数组的最大和三、 乘积最大子数组四、乘积为正数的最长子数组五、等差数列划分六、最长湍流子数组七、单词拆分八、环绕字符串中唯一的子字符串 结语 前言 什么是是动态规划连续子数组、子串系列算法问题? 连续子数组问题通常聚焦…...

结肠镜3D视频数据集-C3VD论文中文版

文章目录 标题作者摘要一、介绍1.1. 相关工作1.1.1. 内镜重建数据集1.1.2. 注册真实和虚拟内窥镜图像1.1.3. 2D-3D注册1.2. 贡献 二、方法2.1. 幻影模型生产2.2. 数据采集2.3. 注册流程概述2.3.1. 数据预处理2.3.2. 目标深度估计2.3.3. 渲染深度帧2.3.4. 边缘损失和优化 2.4. 模…...

封装自己的api签名sdk

api平台接口调用&#xff0c;需要通过签名去核对是不是有效的用户&#xff0c;&#xff0c;一般会给两个key&#xff0c;acceeKey 和 secretKey,第一个相当于用户名&#xff0c;第二个相当于密钥&#xff0c;&#xff0c;&#xff0c;前端通过一定的算法&#xff0c;&#xff0…...

ASP.NET Core Web API 中 HTTP状态码的分类及对应的返回方法

文章目录 前言一、HTTP状态码分类及常用方法二、具体返回方法示例1&#xff09; 2xx 成功类2&#xff09;4xx 客户端错误3&#xff09;5xx 服务器错误4&#xff09;其他特殊状态码 三、高级返回方式1&#xff09;使用 IActionResult 与 ActionResult<T>2&#xff09;统一…...

函数和模式化——python

一、模块和包 将一段代码保存为应该扩展名为.py 的文件&#xff0c;该文件就是模块。Python中的模块分为三种&#xff0c;分别为&#xff1a;内置模块、第三方模块和自定义模块。 内置模块和第三方模块又称为库内置模块&#xff0c;有 python 解释器自带&#xff0c;不用单独安…...

LeetCode 1817 查找用户活跃分钟数

深入剖析 LeetCode 用户活跃分钟数统计问题 一、题目详情 给定用户在 LeetCode 的操作日志&#xff0c;日志以二维整数数组logs表示&#xff0c;其中每个logs[i][IDi, timei]&#xff0c;意味着 ID 为IDi的用户在timei分钟时执行了某个操作。多个用户能够同时执行操作&#x…...

matlab从pytorch中导入LeNet-5网络框架

文章目录 一、Pytorch的LeNet-5网络准备二、保存用于导入matlab的model三、导入matlab四、用matlab训练这个导入的网络 这里演示从pytorch的LeNet-5网络导入到matlab中进行训练用。 一、Pytorch的LeNet-5网络准备 根据LeNet-5的结构图&#xff0c;我们可以写如下结构 import…...

网络:华为HCIA学习笔记:ICMP协议

ICMP&#xff08;Internet Control Message Protocol&#xff09;Internet控制消息协议 前言ICMPICMP重定向ICMP差错监测ICMP错误报告ICMP数据包格式ICMP消息类型和编码类型ICMP应用-PingICMP应用-Tracert 总结 前言 Internet控制消息协议ICMP (Internet Control Message Prot…...

Visio | 将(.vsdx)导出为更清楚/高质量的图片(.png) | 在Word里面的visio图

此时大家在用Visio画完图直接复制到word里面后&#xff0c;如果后期需要重新保存高清图片&#xff0c;但是此时图片在word&#xff0c;是不是很多人会选择直接crtlA截图复制&#xff0c;这样出来的图又不清晰又小&#xff0c;完全不符合你导的审美&#xff0c;接下来跟着我&…...

算法设计学习8

实验目的及要求&#xff1a; 通过深入学习树&#xff08;Tree&#xff09;和二叉树&#xff08;Binary Tree&#xff09;这两种重要的数据结构&#xff0c;掌握它们的基本概念、性质和操作&#xff0c;提高对树形结构的理解和应用能力。通过本实验&#xff0c;学生将深化对树和…...

Dive into Deep Learning - 2.4. Calculus (微积分)

Dive into Deep Learning - 2.4. Calculus {微积分} 1. Derivatives and Differentiation (导数和微分)1.1. Visualization Utilities 2. Chain Rule (链式法则)3. DiscussionReferences 2.4. Calculus https://d2l.ai/chapter_preliminaries/calculus.html For a long time, …...

kotlin中const 和val的区别

在 Kotlin 中&#xff0c;const 和 val 都是用来声明常量的&#xff0c;但它们的使用场景和功能有所不同&#xff1a; 1. val: val 用于声明只读变量&#xff0c;也就是不可修改的变量&#xff08;类似于 Java 中的 final 变量&#xff09;。它可以是任何类型&#xff0c;包括…...

Webpack中loader的作用。

文章目录 前言1. 处理样式文件2. 处理 JavaScript 文件3. 处理其他文件总结 前言 在 Webpack 中&#xff0c;Loader 是用于对模块的源代码进行转换的工具&#xff0c;它能够将不同类型的文件&#xff08;如 CSS、图片、字体、TypeScript 等&#xff09;转换为有效的 JavaScrip…...

C++ 极简常用内容

C 极简常用内容 1. 类与对象 定义&#xff1a;封装数据&#xff08;成员变量&#xff09;和行为&#xff08;成员函数&#xff09;的自定义类型。 Demo&#xff1a; class Car { public:string brand;void drive() { cout << brand << " is moving." …...

如何在windows 环境、且没有显卡的情况下用python跑通从ModelScope下载的大模型的调用

文章目录 背景介绍源代码&#xff1a;安装调试过程1.设置第三方镜像源2.预先安装&#xff1a;3.在python中创建代码&#xff1a;4.最终修改程序,将device_map从“cuda”改成“auto”&#xff0c;大模型调用1.5B&#xff08;1___5B)的5.最终跑出结果解释&#xff1a;示例&#x…...

MINIQMT学习课程Day10

开始获取股票数据课程的学习&#xff1a; 获取qmt账号的持仓情况后&#xff0c;我们进入下一步&#xff0c;如何获得当前账号的委托状况 还是之前的步骤&#xff0c;打开qmt&#xff0c;选择独立交易&#xff0c; 之后使用pycharm&#xff0c;编写py文件 导入包&#xff1a…...

如何彻底关闭Windows 10中的Xbox游戏栏

一、打工人的困扰&#xff1a;不速之客“Game Bar” 在日常工作中&#xff0c;许多使用Windows 10的用户常常被一个不起眼却频频打扰的系统功能困扰&#xff0c;那就是“Xbox游戏栏”&#xff08;Game Bar&#xff09;。当你正在专注处理紧急的Excel表格或准备PPT汇报&#xf…...

26考研资料分享考研资料合集 百度网盘(仅供参考学习)

考研资料分享考研资料合集 百度网盘&#xff08;仅供参考学习&#xff09; 通过网盘分享的文件&#xff1a;2026考研英语数学政治最新等3个文件 链接1: https://pan.baidu.com/s/1JXBI9ROng4KAWHoaUHpkug?pwdjydb 提取码: jydb 链接2:https://pan.baidu.com/s/1a…...

59.基于ssm和vue学生考试成绩管理系统

目录 1.系统的受众说明 2.系统关键技术 2.1 java技术 2.2 MYSQL数据库 2.3 B/S结构 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2经济可行性 3.2 系统性能分析 3.3 系统功能分析 3.5系统流程分析 3.5.1登录流程 3.5.2注册流程 3.5.3添加信息流程 3.5.4删…...

常见的ETL工具分类整理

一、开源ETL工具 ‌Kettle&#xff08;Pentaho Data Integration&#xff09;--Spoon‌ 设计及架构&#xff1a;面向数据仓库建模的传统ETL工具。使用方式&#xff1a;C/S客户端模式&#xff0c;开发和生产环境需要独立部署&#xff0c;任务编写、调试、修改都在本地。底层架构…...

【leetcode100】数组中的第K个最大元素

1、题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,…...

markdown语法学习

三化markdown语法 研究对象系统化全局化结构化markdown语法富文本字体样式*斜体*&#xff0c;主题样式#&#xff0c;表格样式||&#xff0c;代码块样式&#xff0c;待办样式- [ ]样式之间互相协作&#xff0c;互不冲突 待办 斜体 加粗 标题 删除线 public class{ //代码块 …...

Linux_4

开始学习ssh工具 在做开发的时候,肯定不止一台服务器,那么假设每台服务器都是Linux服务器,要在服务器上操作就需要登入终端,即Terminal。ssh的作用就是可以通过一个服务器登陆上其他的服务器。 登陆到哪个服务器看到的就是哪个服务器的终端terminal。 ssh登陆 ssh user@…...

Netty——连接超时 与 断开重连

文章目录 1. 处理连接超时和断开重连的原因2. 处理连接超时和断开重连的方法2.1 处理连接超时2.1.1 步骤一&#xff1a;配置连接超时时间2.1.2 步骤二&#xff1a;监听连接结果 2.2 处理断开重连2.2.1 步骤一&#xff1a;监听连接断开事件2.2.2 步骤二&#xff1a;实现重连逻辑…...

linux 进程/线程设置核亲和性

1&#xff0c;线程绑定内核 #include <pthread.h> #include <stdio.h> #include <stdlib.h> // 定义一个函数&#xff0c;用于设置线程的CPU亲和性 void set_thread_affinity(pthread_t thread, int cpu_id) { cpu_set_t cpuset; int s; // 清空CPU集…...

前端页面鼠标移动监控(鼠标运动、鼠标监控)鼠标节流处理、throttle、限制触发频率(setTimeout、clearInterval)

文章目录 使用lodashjs库手动实现节流&#xff08;通过判断之前设定的定时器setTimeout是否存在&#xff09; 使用lodashjs库 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…...

【MySQL基础-21】MySQL事务机制详解:原理、实现与最佳实践

在现代数据库系统中&#xff0c;事务机制是确保数据一致性和完整性的核心技术。MySQL作为最流行的开源关系型数据库之一&#xff0c;其事务实现机制对于开发者而言至关重要。本文将深入探讨MySQL的事务机制&#xff0c;包括核心概念、实现原理、隔离级别以及实际应用中的最佳实…...

Transformer+BO-SVM时间序列预测(Matlab)

TransformerBO-SVM时间序列预测&#xff08;Matlab&#xff09; 目录 TransformerBO-SVM时间序列预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 普通的单变量时序已经用腻了&#xff0c;审稿人也看烦了&#xff0c;本期推出一期高创…...

Python循环控制语句

1. 循环类型概述 Python提供两种主要的循环结构&#xff1a; while循环 - 在条件为真时重复执行for循环 - 遍历序列中的元素 2. while循环 基本语法 while 条件表达式:循环体代码示例 count 0 while count < 5:print(f"这是第{count1}次循环")count 13. f…...

4.4日西南竞篮,欧篮联,NBA,全扫盘

欧篮联扫盘 301奥林匹亚 vs 阿尔巴 &#xff08;11.5&#xff09;&#xff0c;总分167.5&#xff1a;阿尔巴有伤病&#xff0c;点差11.5大&#xff0c;可能是接近比赛&#xff0c;总分较低&#xff0c;预测阿尔巴赢盘&#xff0c;总分低于167.5。 302埃菲斯 vs 贝红星 (-1.5)&a…...

面试可能会遇到的问题回答(嵌入式软件开发部分)

写在前面&#xff1a; 博主也是刚入社会的小牛马&#xff0c;如果下面有写的不好或者写错的地方欢迎大家指出~ 一、四大件基础知识 1、计算机组成原理 &#xff08;1&#xff09;简单介绍一下中断是什么。 ①回答&#xff1a; ②难度系数&#xff1a;★★ ③难点分析&…...

AI平台初步规划实现和想法

要实现一个类似Coze的工作流搭建引擎&#xff0c;可以结合SmartEngine作为后端工作流引擎&#xff0c;ReactFlow作为前端流程图渲染工具&#xff0c;以及Ant Design作为UI组件库。以下是实现的步骤和关键点&#xff1a; ### 1. 后端工作流引擎&#xff08;SmartEngine&#xf…...

软件工程面试题(二十七)

1、j a v a 对象初始化顺序 1.类的初始化(initialization class & interface) 2.对象的创建(creation of new class instances) 顺序:应为类的加载肯定是第一步的,所以类的初始化在前。大体的初始化顺序是: 类初始化 -> 子类构造函数 -> 父类构造函数 -&g…...

CCF GESP C++编程 六级认证真题 2025年3月

C 六级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D B A B B B B A A A A A B C A 一、单选题 第 1 题 在面向对象编程中&#xff0c;类是一种重要的概念。下面关于类的描述中&#xff0c;不正确的是&#xff08; &#xff09;。 A. 类是一个抽象的概念&a…...

Cortex-M 上编写汇编函数

在 ARM Cortex-M 系列单片机中使用汇编语言编写函数时,需要特别注意寄存器的使用、栈管理、调用约定以及与 C 语言的兼容性。以下是关键注意事项和示例说明: 1. 遵循 AAPCS 调用约定 ARM 定义了 AAPCS(ARM Architecture Procedure Call Standard),规定了函数调用时寄存器…...

Spring 核心技术解析【纯干货版】- XXII:Spring 扫描效率提升模块 Spring-Context-Indexer 模块精讲

在 Spring 应用 中&#xff0c;组件扫描&#xff08;Component Scan&#xff09; 是 Spring 容器启动时的关键任务之一。默认情况下&#xff0c;Spring 通过 反射扫描整个类路径 来找到所有 Component、Service、Repository 等注解的类&#xff0c;并将其注册为 Spring Bean。但…...

jetson AGX orin--ARM64 换源报错Packages 404 Not Found [IP: 2402:f000:1:400::2 443]

问题 原因&#xff1a; ARM64结构不能使用X86结构的源&#xff0c;清华源不完全支持ARM64。使用下面这个源 sudo vim /etc/apt/sources.list 删掉原来的&#xff0c;改成这个 # ARM64 架构专用源 deb [archarm64] http://ports.ubuntu.com/ubuntu-ports focal main restrict…...

对备忘录模式的理解

对备忘录模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1095)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 2、理解需求 二、不采用备忘录设计模式1、代码2、问题3、错误的备忘录模式 三、采用备忘录设计模式1、代码1.1 …...

ngx_ssl_init

定义在 src\event\ngx_event_openssl.c ngx_int_t ngx_ssl_init(ngx_log_t *log) { #if OPENSSL_VERSION_NUMBER > 0x10100003Lif (OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, NULL) 0) {ngx_ssl_error(NGX_LOG_ALERT, log, 0, "OPENSSL_init_ssl() failed")…...