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

ASP.NET Core SignalR 双工通信

01. 介绍 🎯

ASP.NET Core SignalR 是一个开放源代码库,它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码可以在服务器上激发事件时将事件推送到连接的客户端。 使用 SignalR,客户端也可以将消息发送到服务器,从而实现双工通信。

✨示例方案✨

假设你是开发团队的一员,你需要更新现有网站的实时应用功能。 实时地图是下单系统的一部分,它让 Contoso Pizza 的顾客可以跟踪订单进度。

当前的解决方案是通过客户端轮询订单状态更改更新来实现的。 这种方法不是很理想,因为可能会有大量请求涌入服务器。 Contoso Pizza 一直收到订单无法处理的报告,导致销售额和潜在回头客的流失。

日志中报告的故障发生在促销日的高峰时间。 如果有太多顾客同时查看实时订单地图,则服务器会收到大量请求,进程将失败。 在本模块中,你将使用 SignalR 来解决这些问题。

02. 什么是 ASP.NET Core SignalR?

所有连接了 Internet 的应用程序都由服务器和客户端组成。 客户端依赖于服务器获取数据,而它们获取数据的主要机制是通过发出超文本传输协议 (HTTP) 请求来进行的。 某些客户端应用程序需要经常更改的数据。

ASP.NET Core SignalR 提供了一个 API,用于创建服务器到客户端远程过程调用 (RPC)。 RPC 从服务器端 .NET Core 代码中调用客户端上的函数。 支持多个平台,每个平台都有各自的客户端 SDK。 因此,RPC 调用所调用的编程语言可能会有所不同。

2.1 传输 🕸️

SignalR 支持以下方法(或传输)来处理实时通信:

  1. 🥇WebSockets 
  2. 🥈Server-Sent Events 
  3. 🥉长轮询

上面列出的传输的顺序表示其正常回退顺序。 换句话说,Websocket 优于 Server-Sent Events,而 Server-Sent Events 优于 Long Polling,但是这三种传输方式皆可用。 SignalR 会自动在服务器和客户端的能力范围内选择最佳的传输方法。 有关详细信息,请参阅 SignalR 传输协议的正式规范。

2.2 服务器 🖥️

服务器负责公开 SignalR 终结点。 终结点映射到 Hub 或 Hub<T> 子类。 服务器可存在于本地、云提供商(如 Azure)或 Azure SignalR 服务中。 服务器公开可以从客户端调用的中心方法以及客户端可以订阅的事件。 它们被视为远程过程。

2.2.1 集线器 🧶

在 SignalR 中, hub 用于在客户端和服务器之间进行通信。 中心是一种高级管道,允许客户端和服务器相互调用方法。 为此,SignalR 会自动跨计算机边界处理调度。 你可以将中心看作是所有连接的客户端和服务器之间的代理。

2.2.2 协议 📧

SignalR 协议是通过任意 基于消息的传输实现双向 RPC 的协议。 连接中的任何一方都可以对另一方调用程序,并且程序可以返回零个或多个结果或者返回错误。 SignalR 提供了两个内置的 hub  协议:

  • 基于 JSON 的文本协议,这是默认值。
  • 基于 MessagePack 的二进制协议,与 JSON 相比, MessagePack 通常会创建较小的消息。

若要使用 MessagePack 协议,服务器和客户端都需要选择加入以对其进行配置,并且服务器和客户端都必须支持它。 还有第三个中心协议,名为 BlazorPack ,但它仅用于 Blazor-Server 应用程序。 在没有 Blazor-Server 托管模型的情况下,无法使用该协议。 有关详细信息,请参阅 SignalR Hub 协议的官方规范。

2.2.3 用户 🤵‍♂️

系统中的用户是一个个体,但也可以是组的一部分。 消息可以发送到组,所有组成员都会收到通知。 单个用户可以从多个客户端应用程序进行连接。 例如,同一用户可以使用一个移动设备和一个 Web 浏览器,同时在这两个上获取实时更新。

2.2.4 组 👨‍👩‍👧‍👦

一个组包含一个或多个连接。 服务器可以创建组,将连接添加到组,以及从组中删除连接。 组具有指定的名称,该名称充当其唯一标识符。 组充当范围界定机制来帮助定位消息。 也就是说,实时功能只能发送给已命名组中的用户。

2.2.5 连接 🔗

与中心的连接由唯一标识符表示,该标识符只有服务器和客户端知道。 每个 hub 类型都存在单个连接。 每个客户端都有一个到服务器的唯一连接。 也就是说,单个用户可以在多个客户端上表示,但每个客户端连接都有各自的标识符。

2.3 客户端 💻

客户端负责通过 HubConnection 对象建立到服务器终结点的连接。 Hub 连接在每个目标平台中表示:

  • .NET 客户端:Microsoft.AspNetCore.SignalR.Client.HubConnection
  • JavaScript 客户端:@microsoft/signalr.HubConnection
  • Java 客户端:com.microsoft.signalr.HubConnection

有关详细信息,请参阅 ASP.NET Core SignalR 支持的平台。

当中心连接实例成功启动后,消息可以自由地双向流动。 用户可以自由地将通知发送到服务器,以及从服务器接收通知。 客户端是任何已连接的应用程序,例如 Web 浏览器、移动应用或桌面应用等。

03. ASP.NET Core SignalR 的工作原理

3.1 服务器和 Hub 类

Hub类是 SignalR 服务器的概念。 它在 Microsoft.AspNetCore.SignalR 命名空间中定义,并且是 Microsoft.AspNetCore.SignalR NuGet 包的一部分。 面向 Microsoft.NET.Sdk.Web SDK 的 ASP.NET Core Web 应用无需添加 SignalR 的包引用,因为它已作为共享框架的一部分提供。

Hub 通过路由公开。 例如,https://www.contoso-pizza.com/hubs/orders 路由可用于表示 OrdersHub 实现。 通过各种中心 API,作者可以定义方法和事件。

有两个方式可以在中心上公开方法。 创建以下类型的子类和编写方法:

  • Hub:标准中心。
  • Hub<T>:强类型泛型中心。

3.1.1 示例 Hub

作为参考点,请考虑以下 Notification 对象:

namespace RealTime.Models;public record Notification(string Text, DateTime Date);

可以在使用 .NET 客户端 SDK 时共享该对象,使服务器和客户端具有完全相同的对象。 假设有一个如下所述的通知中心:

using Microsoft.AspNetCore.SignalR;
using System;
using System.Threading.Tasks;
using RealTime.Models;namespace ExampleServer.Hubs;public sealed class NotificationHub : Hub
{public Task NotifyAll(Notification notification) =>Clients.All.SendAsync("NotificationReceived", notification);
}

对于方法与事件之间的差异,上述中心实施中的方法是 NotifyAll,而事件是 NotificationReceived NotificationHub 必须是 Hub 的子类。 NotifyAll 方法返回 Task,并接受单个 Notification 参数。 该方法表示为从 Clients.All 调用 SendAsyncClients.All 表示所有连接的客户端。 将激发 NotificationReceived 事件,依赖于 notification 实例。

3.1.2 IHubContext 实例

 Hub  IHubContext 实例激发事件。 SignalR 中心是用于将消息发送到连接到 SignalR 服务器的客户端的核心抽象。 还可以使用以下任一类型从应用中的其他位置发送消息:

  • IHubContext<THub>:一个上下文,其中 THub 表示标准中心。
  • IHubContext<THub,T>:一个上下文,其中 THub 表示强类型泛型中心,T 表示相应类型的客户端。

💥重要:

IHubContext 用于向客户端发送通知。 它不用于调用 Hub 上的方法。

IHubContext 示例

考虑到上一个通知中心实施,你可以使用 IHubContext<NotificationHub>,如下所示:

using Microsoft.AspNetCore.SignalR;
using System;
using System.Threading.Tasks;
using RealTime.Models;namespace ExampleServer.Services;public sealed class NotificationService(IHubContext<NotificationHub> hubContext)
{public Task SendNotificationAsync(Notification notification) =>notification is not null? hubContext.Clients.All.SendAsync("NotificationReceived", notification): Task.CompletedTask;
}

前面的 C# 代码依赖 IHubContext<NotificationHub> 来访问客户端的上下文列表,公开了广播通知的功能。 在作用域中捕获的 hubContext 主构造函数参数用于触发 "NotificationReceived" 事件,但它并不旨在用于调用中心的 NotifyAll 方法。

3.1.3 方法

Hub  Hub<T> 方法与其他任何 C# 方法相同。 它们都定义返回类型、方法名称和参数。

  • Hub方法最常见的返回类型为 Task  Task<TResult>,后者表示异步 hub 操作。
  • 方法名称用于从客户端调用方法。 你可以使用 HubMethodNameAttribute 对其进行自定义。
  • 参数是可选的,但在定义时,客户端应提供相应的参数。

💢方法不需要触发事件,但通常会触发。

3.1.4 事件

可以从客户端按名称来订阅事件。 服务器负责引发事件。 HubHub<T>IHubContext<THub> 和 IHubContext<THub, T> 事件已命名,并且最多可以定义 10 个参数。 事件在服务器上触发,并由感兴趣的客户端进行处理。 当客户端订阅其 hub 连接上的事件时,该客户端则视为感兴趣的客户端。 当客户端调用由于其调用而激发事件的中心方法时,会间接地触发事件。 不过,客户端无法直接触发事件,因为这是服务器的职责。

事件客户端范围

从 IClientProxy 实例调用事件。 你从 Clients 类型实现 IHubClients和 IHubCallerClients 接口。 有多种方法可以将范围界定到特定 IClientProxy 实例。 可以从 Hub.Clients 属性定位以下范围:

成员详细信息
All所有连接的客户端(例如广播)。
AllExcept所有连接的客户端,不包括指定的连接(例如筛选的广播)。
Caller触发方法的连接的客户端(如回显)。
Client指定的客户端连接(单个连接)。
Clients指定的客户端连接(多个连接)。
Group指定组中的所有连接的客户端。
GroupExcept指定组中的所有连接的客户端(不包括指定的连接)。
Groups指定组中的所有连接的客户端(多个组)。
Others所有连接的客户端(不包括触发方法的客户端)。
OthersInGroup指定组中的所有连接的客户端(不包括触发方法的客户端)。
User指定用户的所有连接的客户端(单个用户可以连接到多个设备)。
Users指定用户的所有连接的客户端。

💢示例范围

请考虑以下图片,这些图片直观地显示了中心是如何向目标客户端发送消息的。 你可以展开图片,以方便阅读。

  • 广播到所有对象 👨‍👩‍👧‍👦

    ASP.NET Core SignalR hub sending message with Clients.All syntax.

    所有连接的客户端都将收到此消息,而不考虑它们可能属于或不属于的组。

  • 独立用户 🤵‍♂️

    ASP.NET Core SignalR hub sending message with Clients.User syntax.

    单个用户会将收到此消息,无论当前正在使用多少设备。

  • 独立组 💑

    ASP.NET Core SignalR hub sending message with Clients.Group syntax.

    只有属于特定组的客户端才会收到此消息。

3.2 客户端和 HubConnection 类

HubConnection 类是 SignalR 客户端概念,表示客户端与服务器 Hub 的连接。 它在 Microsoft.AspNetCore.SignalR.Client 命名空间中定义,并且是 Microsoft.AspNetCore.SignalR.Client NuGet 包的一部分。

你使用生成器模式和相应的 HubConnectionBuilder 类型创建 HubConnection。 考虑到中心的路由(或者 System.Uri),你可以创建 HubConnection。 生成器还可以指定其他配置选项,包括日志记录、所需的协议、身份验证令牌转发和自动重新连接,等等。

HubConnection API 公开启动和停止函数,分别用于启动和停止到服务器的连接。 此外,还提供了流式处理、调用 hub 方法和订阅事件的功能。

3.2.1 创建 HubConnection 示例

若要从 .NET SignalR 客户端 SDK 创建 HubConnection 对象,请使用 HubConnectionBuilder 类型:

using Microsoft.AspNetCore.SignalR.Client;
using System;
using System.Threading.Tasks;
using RealTime.Models;namespace ExampleClient;public sealed class Consumer : IAsyncDisposable
{private readonly string HostDomain =Environment.GetEnvironmentVariable("HOST_DOMAIN");private HubConnection _hubConnection;public Consumer(){_hubConnection = new HubConnectionBuilder().WithUrl(new Uri($"{HostDomain}/hub/notifications")).WithAutomaticReconnect().Build();}public Task StartNotificationConnectionAsync() =>_hubConnection.StartAsync();public async ValueTask DisposeAsync(){if (_hubConnection is not null){await _hubConnection.DisposeAsync();_hubConnection = null;}}
}

3.2.2 调用 hub 方法

如果客户端已经有一个已成功启动的客户端 HubConnection 实例,则该客户端可以使用 InvokeAsync 或 SendAsync 扩展调用中心上的方法。 如果中心方法返回 Task<TResult>,则 InvokeAsync<TResult> 结果的类型为 TResult。 如果中心方法返回 Task,则不会生成任何结果。 InvokeAsync  SendAsync 都需要中心方法的名称,以及 0 到 10 个参数。

  • InvokeAsync:使用指定的方法名称和可选参数调用服务器上的中心方法。
  • SendAsync:使用指定的方法名称和可选参数调用服务器上的中心方法。 此方法不会等待接收方的响应。

3.2.3 中心方法调用示例

SendNotificationAsync 向之前的 Consumer 类添加方法时,SendNotificationAsync 将委托给 _hubConnection,并根据 Notification 实例调用服务器中心上的 NotifyAll 方法。

public Task SendNotificationAsync(string text) =>_hubConnection.InvokeAsync("NotifyAll", new Notification(text, DateTime.UtcNow));

3.2.4 处理事件

若要处理事件,请在 HubConnection 实例上注册一个处理程序。 如果你知道中心方法的名称并拥有 0 到 8 个参数,请调用其中一个 HubConnectionExtensions.On 重载。 处理程序可以满足以下任何 Action 变体:

  • Action
  • Action<T>
  • Action<T1,T2>
  • Action<T1,T2,T3>
  • Action<T1,T2,T3,T4>
  • Action<T1,T2,T3,T4,T5>
  • Action<T1,T2,T3,T4,T5,T6>
  • Action<T1,T2,T3,T4,T5,T6,T7>
  • Action<T1,T2,T3,T4,T5,T6,T7,T8>

或者,可以使用异步处理程序 API,当 TResult 是 Task 变体时,它们是 Func<TResult>

  • Func<Task>
  • Func<T,Task>
  • Func<T1,T2,Task>
  • ASP.NET Core SignalR 入门
  • Func<T1,T2,T3,T4,Task>
  • Func<T1,T2,T3,T4,T5,Task>
  • Func<T1,T2,T3,T4,T5,T6,Task>
  • Func<T1,T2,T3,T4,T5,T6,T7,Task>
  • Func<T1,T2,T3,T4,T5,T6,T7,T8,Task>

注册事件处理程序的结果是 IDisposable,它充当订阅。 若要取消订阅处理程序,请调用 Dispose。

3.2.5 事件注册示例

更新上一个 Consumer 类时,通过提供处理程序并调用 On 来注册事件:

using Microsoft.AspNetCore.SignalR.Client;
using System;
using System.Threading.Tasks;
using RealTime.Models;namespace ExampleClient;public sealed class Consumer : IAsyncDisposable
{private readonly string HostDomain =Environment.GetEnvironmentVariable("HOST_DOMAIN");private HubConnection _hubConnection;public Consumer(){_hubConnection = new HubConnectionBuilder().WithUrl(new Uri($"{HostDomain}/hub/notifications")).WithAutomaticReconnect().Build();_hubConnection.On<Notification>("NotificationReceived", OnNotificationReceivedAsync);}private async Task OnNotificationReceivedAsync(Notification notification){// Do something meaningful with the notification.await Task.CompletedTask;}// Omitted for brevity.
}

当服务器的 hub 实例激发 "NotificationReceived" 事件时,将调用 OnNotificationReceivedAsync 方法。

3.3 Contoso Pizza 实时订单更新

Web 应用的服务器代码需要具有 Hub 实施,并且向客户端公开路由。 Hub 可以使用订单对象的唯一标识符创建用于跟踪的组。 然后,可以在此组中传达所有订单状态更改更新。

还需要更新客户端代码,以指示 Contoso Pizza 应用程序是 Blazor WebAssembly 应用。 可以使用 JavaScript SDK 或 .NET 客户端 SDK。 然后,将客户端轮询功能替换为生成 HubConnection 的代码,并启动到服务器的连接。 当导航到订单跟踪页时,代码必须加入订单的特定组,更改更新将发送到该组。 你需要订阅事件以获取订单状态更改,并进行相应的处理。

04.何时使用 ASP.NET Core SignalR

SignalR 提供实时 Web 功能。 回想一下,Contoso Pizza 需要实时地图来跟踪订单的状态和送达情况。 高峰时段的销售额损失促使团队调查比客户端轮询更好的解决方案。

决策条件

了解何时选择 SignalR 与了解何时应选择 SignalR 一样重要。 使用实时 Web 功能时,应用的用户体验依赖于其响应能力。 最好了解应用程序的哪些部分需要实时更新。

不应使用 SignalR 的情况

SignalR 的持久性取决于基础连接。 也就是说,如果有理由担心客户端应用程序的连接性,则 SignalR 并不是最佳选择。

另一个考虑因素是 SignalR 的可伸缩性。 根据并发连接的客户端数,Web 服务器在达到其限制时可能会发生资源争用。 在这种情况下,可能需要将应用程序部署到服务器场并使用底板。 自行实现此操作可能很繁琐。

或者,可以使用 Azure SignalR 服务解决此问题。 或者,可以利用各种复原能力和灾难恢复机制来缓解此问题。

SignalR 模态示例

可以在本地或云中使用 SignalR,也可以与 Azure SignalR 服务一起使用。

  • 本地:

    Diagram of ASP.NET Core SignalR being used on-premises.

  • 在云中:

    Diagram of ASP.NET Core SignalR being used in the cloud.

  • 与 Azure SignalR 服务一起:

    Diagram of using Azure SignalR Service.

💢有效用例

SignalR 不能替代传统的 HTTP 请求。 应用程序可以使用 SignalR 了解何时发出特定的 HTTP 请求。 这样一来,它们可以相互补充。

SignalR 有许多有效的用例。 以下列表表示 SignalR 的良好候选项:

  • 💯需要从服务器进行高频率更新的应用:
    • 游戏
    • 社交网络
    • Voting
    • 拍卖
    • GPS 应用
  • 💯仪表板和监视应用:
    • 公司仪表板
    • 实时地图
    • 即时销售更新
    • 旅行警报
    • 持续集成和持续交付 (CI/CD) 管道页
  • 💯协作式和多用户交互式应用:
    • 白板应用
    • 团队会议应用
    • 文档共享应用
    • Visual Studio Live Share
  • 💯需要即时通知的应用:
    • 电子邮件应用
    • 聊天应用
    • 基于轮次的游戏
    • 时序报告
    • GitHub Actions、发出和拉取请求系统

💯Contoso Pizza 方案

如果你在考虑 Contoso Pizza 实时订单地图中的客户端轮询解决方案,SignalR 可能是一种可行的替代方法。 与所有的编程和体系结构决策一样,请务必权衡 SignalR 的优点和缺点。

 🪁 快速创建请移步: ASP.NET Core SignalR 入门

 

相关文章:

ASP.NET Core SignalR 双工通信

01. 介绍 &#x1f3af; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码可以在服务器上激发事件时将事件推送到连接的客户端。 使用 SignalR&#xff0c;客户端也可以将消息发送到服务器&#xff…...

以数据驱动增长,火山引擎数智平台“数据找人”为双12营销提效

“双12”即将来临&#xff0c;众多商家最为关心的&#xff0c;莫过于如何借助对数据的充分利用实现降本增效&#xff0c;在竞争激烈的大环境中快人一步&#xff0c;为了达成这个目标&#xff0c;商家往往需要耗费人力、物力以及时间对海量数据进行寻找与分析。 那么&#xff0c…...

VuePress学习

1.介绍 VuePress 由两部分组成&#xff1a;第一部分是一个极简静态网站生成器 (opens new window)&#xff0c;它包含由 Vue 驱动的主题系统和插件 API&#xff0c;另一个部分是为书写技术文档而优化的默认主题&#xff0c;它的诞生初衷是为了支持 Vue 及其子项目的文档需求。…...

mysql cpu线上问题排查

查看当前的线程情况 show full processlist 查看当前的线程情况 SELECT * FROM performance_schema.threads WHERE PROCESSLIST_TIME > 0 查看当前数据库的连接数 SELECT * FROM performance_schema.threads WHERE PROCESSLIST_DB ‘db’ ; 查看当前mysql连接的数 SHOW GLO…...

QT6学习 第九天 QDialog

QT6学习第九天 QDialog 对话框 QDialog模态和非模态对话框标准对话框颜色对话框进度对话框 对话框 QDialog 模态和非模态对话框 QDialog 类是所有对话框类的基类。对话框是一个经常用来完成短小任务或和用户进行简单交互的顶层窗口。按照运行对话框时是否还可以和该程序的其…...

windows基础

系统目录 服务 端口 注册表 黑客常用DOS命令&#xff08;在拿到shell时会用到&#xff09; 一、 系统目录 Windows目录 系统的安装目录 System32configSAM文件 是用户密码的存储文件 System32etchost文件 记录本地解析&#xff08;优先级大于DNS域名解析&#xff09;可以自…...

《向量数据库指南》——OPPO分布式向量检索的实战与突破

OPPO对向量检索的探索:从单机到分布式的华丽转身 在当今这个数据爆炸的时代,如何高效地存储、检索和分析数据,成为了企业面临的一大挑战。特别是在人工智能领域,向量数据的处理更是占据了举足轻重的地位。OPPO,作为全球知名的智能手机制造商,自然也不会放过这个技术风口…...

golang语言机构和基础语法

语言结构和基础语法 1.包声明 2.引入包 3.函数 4.init函数 5.变量 6.标识符 7.行分隔符 8.语句&表达式 9.注释 10.公有成员与私有成员 11.关键字、保留字和预定义标志引用类型 1.切片 2.map 3.channel 4.interface 5.func 6.指针类型关键词 1.break 跳转语句&#xff0c…...

在 MacOS 上为 LM Studio 更换镜像源

在 MacOS 之中使用 LM Studio 部署本地 LLM时&#xff0c;用户可能会遇到无法下载模型的问题。 一般的解决方法是在 huggingface.co 或者国内的镜像站 hf-mirror.com 的项目介绍卡页面下载模型后拖入 LM Studio 的模型文件夹。这样无法利用 LM Studio 本身的搜索功能。 本文将…...

python之Django连接数据库

文章目录 连接Mysql数据库安装Mysql驱动配置数据库信息明确连接驱动定义模型在模型下的models.py中定义表对象在settings.py 中找到INSTALLED_APPS添加创建的模型 测试testdb.py中写增删改查操作urls.py添加请求路径启动项目进行测试 连接Mysql数据库 安装Mysql驱动 pip inst…...

LLM学习笔记(15)LangChain、LlamaIndex、LlamaIndex

Transformer 和 PyTorch 是什么关系&#xff1f; Transformer和PyTorch可以很好地配合使用&#xff0c;但它们并不是同一层面的工具。具体来说&#xff1a; Transformer是一个神经网络的架构&#xff0c;最初用于自然语言处理&#xff0c;但也可以扩展到其他任务&#xff08;…...

springai结合ollama

目录 ollama 介绍 使用 下载&#xff1a; 安装&#xff1a; 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网&#xff1a;Ollama Ollama是一个用于部署和运行各种开源大模型的工具&#xff1b; …...

扫描IP段内的使用的IP

扫描IP段内的使用的IP 方法一&#xff1a;命令行 命令行进入 for /L %i IN (1,1,254) DO ping -w 1 -n 1 192.168.3.%iarp -a方法二&#xff1a;python from scapy.all import ARP, Ether, srp import keyboarddef scan_network(ip_range):# 创建一个ARP请求包arp ARP(pds…...

ai即可一键生成ppt解决烦恼

在快节奏的职场环境中&#xff0c;制作PPT已经成为许多人日常工作的一部分。尽管PPT看似简单&#xff0c;却常常让人耗费大量时间。好在技术的进步为我们带来了全新的解决方案&#xff0c;比如智能生成PPT&#xff0c;让那些深夜加班的人看到了曙光。 从“手动排版”到“一键生…...

三、【docker】docker和docker-compose的常用命令

文章目录 一、docker常用命令1、镜像管理2、容器管理3、容器监控和调试4、网络管理5、数据卷管理6、系统维护7、实用组合命令8、常用技巧二、docker-compose常用命令1、基本命令2、构建相关3、运行维护4、常用组合命令5、实用参数 一、docker常用命令 1、镜像管理 # 查看本地…...

「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果

本篇将带你实现一个带有闪烁动画的按钮交互效果。通过动态改变按钮颜色&#xff0c;用户可以在视觉上感受到按钮的闪烁效果&#xff0c;提升界面互动体验。 关键词 UI互动应用闪烁动画动态按钮状态管理用户交互 一、功能说明 闪烁按钮效果应用实现了一个动态交互功能&#xf…...

小白爬虫——selenium入门超详细教程

目录 一、selenium简介 二、环境安装 2.1、安装Selenium 2.2、浏览器驱动安装 三、基本操作 3.1、对页面进行操作 3.1.1、初始化webdriver 3.1.2、打开网页 3.1.3、页面操作 3.1.4、页面数据提取 3.1.5、关闭页面 3.1.6、综合小案例 3.2、对页面元素进行操作 3.2.…...

斯坦福李飞飞《AI Agent:多模态交互前沿调查》论文

多模态AI系统很可能会在我们的日常生活中无处不在。将这些系统具身化为物理和虚拟环境中的代理是一种有前途的方式&#xff0c;以使其更加互动化。目前&#xff0c;这些系统利用现有的基础模型作为构建具身代理的基本构件。将代理嵌入这样的环境中&#xff0c;有助于模型处理和…...

Wordpress ElementorPageBuilder插件存在文件读取漏洞(CVE-2024-9935)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

多模态视频大模型Aria在Docker部署

多模态视频大模型Aria在Docker部署 契机 ⚙ 闲逛HuggingFace的时候发现一个25.3B的多模态大模型&#xff0c;支持图片和视频。刚好我有H20的GPU所以部署来看看效果&#xff0c;因为我的宿主机是cuda-12.1所以为了防止环境污染采用docker部署&#xff0c;通过一系列的披荆斩棘…...

【网盘系统】递归删除批量文件

为何需要用到递归&#xff1f; 在网盘系统中&#xff0c;文件的类型分为文件和文件夹两种类型。当我们想要批量删除文件时&#xff0c;不乏其中会包含文件夹&#xff0c;而想要删除这个文件夹&#xff0c;自然其中所包含的文件都要删除&#xff0c;而其中所包含的文件也有可能…...

产品转后端?2

产品经理的视角能让你成为更好的后端工程师&#xff1a; 理解业务需求转换为技术方案的过程知道为什么要这样设计API明白数据结构的选择如何影响用户体验了解性能指标对业务的实际影响 在实习过程中可以有意识地向后端倾斜&#xff1a; 常规产品经理工作&#xff1a; "…...

电子商务人工智能指南 2/6 - 需求预测和库存管理

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...

CSS中要注意的样式效果

1. 应用过渡效果 transition: var(--aa); 2.告诉浏览器元素可能会发生变换&#xff0c;从而优化性能。 will-change: transform; 3.使元素不响应鼠标事件。 pointer-events: none; 4.隐藏水平方向上的溢出内容 overflow-x: hidden; 5.定义一个元素的宽度和高度之间的比…...

CTFshowPHP特性

目录 web89 代码分析 playload web90 代码分析 playload web91 代码分析 playload web92 代码分析 playload web93 代码分析 playload web94 代码分析 playload web95 web96 代码分析 playload web97 代码分析 playload web98 代码分析 playload w…...

基于Springboot+Vue的电子博物馆系统

基于SpringbootVue的电子博物馆系统 前言&#xff1a;随着信息技术的不断发展&#xff0c;传统博物馆的参观方式逐渐向数字化、在线化转型。电子博物馆作为这一转型的重要组成部分&#xff0c;能够通过信息化手段为用户提供更丰富、更便捷的博物馆参观体验。本文基于Spring Boo…...

HarmonyOS:使用HTTP访问网络

HTTP 一、导入http模块 module.json5里添加网络权限 导入http模块 二、创建http请求 创建http请求 import { http } from kit.NetworkKitfunction getNetData() {// 创建数据请求对象let httpRequest http.createHttp() }三、发起请求 请求方法 四、请求示例 GET请求 PO…...

sqlmap --os-shell的原理(MySQL,MSSQL,PostgreSQL,Oracle,SQLite)

1. MySQL 条件 数据库用户需要具备高权限&#xff08;如 FILE 权限&#xff09;。数据库服务运行用户需要对目标目录有写权限。Web 服务器有可写目录&#xff0c;且支持执行上传的脚本&#xff08;如 PHP、JSP 等&#xff09;。 原理 利用 MySQL 的 SELECT ... INTO OUTFIL…...

浅谈网络安全态势感知

一、基本概念 前美国空军首席科学家Endsley博士给出的动态环境中态势感知的通用定义是: 态势感知是感知大量的时间和空间中的环境要素&#xff0c;理解它们的意义&#xff0c;并预测它们在不久将来的状态。 在这个定义中&#xff0c;我们可以提炼出态势感知的三个要素&#xf…...

【大模型】ChatGPT 提示词优化进阶操作实战详解

目录 一、前言 二、ChatGPT 提示词几个基本的优化原则 2.1 明确的提示词 2.1.1 提示词具体而清晰 2.1.1.1操作案例演示 2.2 确定焦点 2.2.1 操作案例演示 2.3 保持提示词的相关性 2.3.1 什么是相关性 2.3.2 提示词相关性操作案例一 2.3.2 提示词相关性操作案例二 三…...

【计算机网络】实验11:边界网关协议BGP

实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议&#xff08;BGP&#xff09;的实际作用&#xff0c;并深入学习在路由器上配置和使用BGP协议的方法。通过实验&#xff0c;我将探索BGP在不同自治系统之间的路由选择和信息交换的功能&#xff0c;理解其在互…...

【Linux系统】System V 的 IPC 机制在 Linux 系统中的实现

System V 的 IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09; 机制是 UNIX 系统中的一大特色&#xff0c;用于在不同进程之间共享数据或同步操作。Linux 系统完整实现了 System V 的 IPC 机制&#xff0c;并在其基础上进行了优化和扩展。这些机…...

计算机网络安全

从广义来说&#xff0c;凡是涉及到网络上信息的机密性、报文完整性、端点鉴别等技术和理论都是网络安全的研究领域。 机密性指仅有发送方和接收方能理解传输报文的内容&#xff0c;而其他未授权用户不能解密&#xff08;理解&#xff09;该报文报文完整性指报文在传输过程中不…...

30.100ASK_T113-PRO 用QT编写视频播放器(一)

1.再buildroot中添加视频解码库 X264, 执行 make menuconfig Target packages -->Libraries --> Multimedia --> X264 CLI 还需要添加 FFmpeg 2. 保存,重新编译 make all 3.将镜像下载开发板...

攻防世界 ctf刷题 新手区1-10

unserialize3 因为我上个笔记写了 php返序列化 所以先趁热打铁 看这个题目名字 我们就知道是 反序列化呀 因为flag有值所以 我们先输个 111 看看有没有线索 没线索但是这边 有个发现就是他是使用get方式传参的 可能他会把我们的输入 进行传入后台有可能进行反…...

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集

目录 01背包理论基础&#xff08;一&#xff09; 基本思路 C代码 01背包理论基础&#xff08;二&#xff09; 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础&#xff08;一&#xff09; 题目链接&#xff1a;卡码网46. 携带研究材料 文字…...

三款电容麦的对比

纸面参数 第一款麦克风 灵敏度: -36 dB 2 dB&#xff08;0 dB1V/Pa at 1 kHz&#xff09; 灵敏度较低&#xff0c;需要更高的增益来拾取同样的音量。频率响应: 40 Hz - 18 kHz 响应范围较窄&#xff0c;尤其在高频区域。等效噪音级: ≤18 dB&#xff08;A计权&#xff09; 噪…...

【实战攻略】如何从零开始快速实现深度学习新想法?——四步走战略

标题 【实战攻略】如何从零开始快速实现深度学习新想法&#xff1f;——四步走战略 【核心结论】 通过四步走战略&#xff0c;即找到baseline论文、深入baseline代码、搭建自己的pipeline、融入核心算法&#xff0c;新手也能快速实现深度学习新想法。 【通俗解释&#xff0…...

Python+OpenCV系列:入门环境搭建、图像读写、像素操作、色彩空间和通道、

入门环境搭建、图像读写、像素操作、色彩空间和通道 **Python与OpenCV环境搭建、图像处理与色彩空间介绍****引言****1. Python和OpenCV的环境搭建****1.1 安装Python和OpenCV****1.2 配置开发环境** **2. 图像的读取、显示与保存****2.1 图像的读取****2.2 图像的显示****2.3 …...

如何在鸿蒙API9和x86模拟器中使用MQTT

目录 引言 安装MQTT软件包 避免MQTT软件包自动升级 程序的编写 运行测试 结语 引言 虽然我的课主要是OpenHarmony南向开发的&#xff0c;但是结课时有个同学说他在写鸿蒙APP时无法将MQTT库加入到设备中&#xff0c;希望我帮忙看看。由于他没有鸿蒙的真机&#xff0c;只能…...

http multipart/form-data 数据如何分块传输是一次传输还是多次

multipart/form-data 是一种用于 HTTP 协议中传输数据的格式&#xff0c;它用于传输数据量较大的数据&#xff0c;如文件等。在 multipart/form-data 中&#xff0c;数据可以被分成多个部分&#xff08;chunk&#xff09;&#xff0c;这些部分之间通过特定的分隔符进行分隔。 …...

️️耗时一周,肝了一个超丝滑的卡盒小程序

前言 先看看成品效果&#xff1a; 在上个月&#xff0c;我出于提升自己的英语造句能力的目的&#xff0c;想要找一个阅读或者练习造句类的英语学习 APP&#xff0c;但是最终找了几个 APP 不是不太好用就是要付费。于是我转换思路&#xff0c;找到了一本书&#xff0c;叫《36…...

ubuntu的matlab使用心得

1.读取视频 v VideoReader(2222.mp4);出问题&#xff0c;报错&#xff1a; matlab 错误使用 VideoReader/initReader (第 734 行) 由于出现意外错误而无法读取文件。原因: Unable to initialize the video properties 出错 audiovideo.internal.IVideoReader (第 136 行) init…...

vscode插件 live-server配置https

背景&#xff1a;前端有时候需要在本地搭建https环境测试某些内容&#xff08;如https下访问http资源&#xff0c;下载&#xff09; 步骤&#xff1a; 1.vscode集成开发软件(应该所有前端开发同学都安装了&#xff0c;我用webstorm&#xff0c;vscode备用) 2.vscode安装live…...

腾讯最新图标点选验证码

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/iconclick/9 注意:后续点选验证码内容我不会再讲那么详细,毕竟点选验证训练很多读者都会,而…...

安防视频监控平台Liveweb视频汇聚管理系统管理方案

智慧安防监控Liveweb视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚Liveweb平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…...

VBA信息获取与处理第四个专题第二节:将工作表数据写入VBA数组

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…...

神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明

(一) SummaryWriter 这里先讲解 SummaryWriter &#xff0c;TensorBoard 会在第二大点进行说明。 SummaryWriter 是 PyTorch 中的一个非常实用的工具&#xff0c;它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来&#xff0c;并可以与 TensorBoard 配合使用&am…...

SpringBoot的validation参数校验

文章目录 前言一、引入validation 依赖二、validation中的注解说明 &#xff08;1&#xff09;Validated&#xff08;2&#xff09;Valid&#xff08;3&#xff09;NotNull&#xff08;4&#xff09;NotBlank&#xff08;5&#xff09;NotEmpty&#xff08;6&#xff09;Patte…...

RPC与HTTP调用模式的架构差异

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;和 HTTP 调用是两种常见的通信模式&#xff0c;它们在架构上有以下一些主要差异&#xff1a; 协议层面 RPC&#xff1a;通常使用自定义的二进制协议&#xff0c;对数据进行高效的序列化和反序列化&am…...