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

Robyn高性能Web框架系列06:使用WebSocket实现产品智能助理

使用WebSocket实现产品智能助理

    • WebSocket原理与应用场景
    • Robyn的WebSocket基本使用
      • 1、创建WebSocket服务
      • 2、侦听WebSocket事件
      • 3、向客户端发送消息
      • 4、向客户端广播消息
      • 5、使用查询参数
      • 6、主动关闭连接
    • 示例:简易的产品智能助理
      • 1、产品数据部分
      • 2、产品信息部分
      • 3、智能助理部分


Robyn原生支持WebSocket协议,通过WebSocket协议,客户端(通常是浏览器)和服务器可以随时主动向对方发送数据,这在一定程度上弥补了HTTP协议在实时性上的不足,并带来了一些新的应用场景,本节我们介绍基于Robyn的WebSocket应用开发。

WebSocket原理与应用场景

WebSocket 是一种基于 TCP 的全双工通信协议,允许客户端和服务器之间进行持续、低延迟的双向通信。它是为了解决传统 HTTP 协议的请求-响应限制而设计的,尤其适合实时性要求高的场景,如聊天室、在线游戏、股票行情推送等。
在使用HTTP协议来实现这些实时性要求高的功能时,通常只能通过轮询或长轮询的方式,这就会带来以下问题:

  • 效率低: 大部分轮询请求可能没有新数据(浪费带宽和服务器资源)。
  • 延迟高: 从事件发生到客户端知道,需要等待下一个轮询请求的间隔时间。
  • 开销大: 每个 HTTP 请求都包含完整的HTTP头信息,即使数据体很小。

而WebSocket则通过下列设计特点解决了上述问题:

  • 一次握手,持久连接
    连接开始时,客户端通过一个特殊的 HTTP Upgrade 请求发起 WebSocket 握手。如果服务器支持 WebSocket协议,它会返回一个 101 Switching Protocols 响应。一旦握手成功,底层的 TCP 连接就保持打开状态,用于后续的 WebSocket 数据帧传输,不需要反复建立连接。

  • 全双工通信
    连接建立后,服务器和客户端可以随时、独立地向对方发送数据。服务器不需要等待客户端的请求就能主动推送信息。

  • 轻量级数据帧
    WebSocket 传输的数据单位是“帧”。相比 HTTP 请求/响应的头部,WebSocket 帧的头部开销非常小(通常只有几个字节)。这对于传输小量但频繁的数据(如聊天消息、游戏指令)特别高效。

  • 低延迟
    由于连接是持久的,并且服务器可以主动推送,数据从一端产生到另一端接收的延迟极低,接近网络传输本身的延迟。

下面是WebSocket 基本通信过程:

客户端(浏览器) 服务器 HTTP 请求\n(带 Upgrade: websocket 头) HTTP 101 Switching Protocols\n(协议升级确认) WebSocket 连接建立成功\n进入全双工通信状态 发送消息(如:{"type": "ping"}) 返回消息(如:{"type": "pong"}) 主动推送数据(如:价格更新) 客户端响应 / 再次发送数据 可持续传输,直到任一方关闭连接 关闭连接请求(Close Frame) 确认关闭(Close Frame) WebSocket 连接关闭 客户端(浏览器) 服务器

Robyn的WebSocket基本使用

1、创建WebSocket服务

Robyn可以通过实例化一个WebSocket类,绑定到Robyn主应用中,就能为当前Robyn应用开启WebSocket功能。

from robyn import Robyn, jsonify, WebSocketapp = Robyn(__file__)
websocket = WebSocket(app, "/web_socket")

2、侦听WebSocket事件

通过WebSocket的on方法,可以为不同的WebSocket的connectmessageclose事件编写不同的处理代码。

@websocket.on("message")
def connect():return "Hello world, from ws"@websocket.on("close")
def close():return "Goodbye world, from ws"@websocket.on("connect")
def message():return "Connected to ws"

3、向客户端发送消息

通过WebSocket的sync_send_to方法(同步方式)或async_send_to方法(异步方式)可以向客户端发送消息。

@websocket.on("message")def message(ws, msg, global_dependencies) -> str:websocket_id = ws.idws.sync_send_to(websocket_id, "This is a message to self")# await ws.async_send_to(websocket_id, "This is a message to self")return ""

4、向客户端广播消息

通过WebSocket的sync_broadcast方法(同步方式)或async_broadcast方法(异步方式)可以向客户端广播消息。

  @websocket.on("message")def message(ws, msg, global_dependencies) -> str:websocket_id = ws.idws.sync_broadcast("This is a message to self")return ""

5、使用查询参数

在WebSocket路由函数中同样也能处理查询参数,WebSocket提供了query_params集合用于存储来自客户端的查询参数。

  @websocket.on("message")async def message(ws, msg, global_dependencies) -> str:websocket_id = ws.idif (ws.query_params.get("name") == "gordon" and ws.query_params.get("desg") == "commissioner"):ws.sync_broadcast("Gordon authorized to login!")return ""

6、主动关闭连接

通过WebSocket的close方法,可以主动关闭与客户端的连接,并将该客户端从WebSocket 注册表中删除。

@websocket.on("message")
def message(ws, msg):if msg == "disconnect":ws.close()return "Closing connection"return "Message received"

示例:简易的产品智能助理

下面我们通过一个综合实例来进一步熟悉一下Robyn的WebSocket编程。在实例中,我们模拟一个产品智能助理程序,用户可以通过与产品智能助理的交流来了解一款产品的基本信息。整个程序结构大体如下:

产品信息页面
产品数据库
产品智能助理

1、产品数据部分

产品数据部分主要为产品信息页面产品智能助理提供基础数据,它可以是来自Mysql等数据库,这里用dict做简单的模拟。

product_list={  "1": {"id":"1","name": "iPhone 14 Pro", "price": 999, "color": "黑色、银色", "size": "6.1英寸", "delivery": "2-3天"},  "2": {"id":"2","name": "Samsung Galaxy S22", "price": 799, "color": "白色、黑色、红色", "size": "6.2英寸", "delivery": "3-5天"},  "3": {"id":"3","name": "Google Pixel 6", "price": 599, "color": "蓝色、白色", "size": "6.4英寸", "delivery": "1-2天"}  
}

2、产品信息部分

产品信息部分用于展示产品基本信息,它是一个普通的网页,这里我们使用了Robyn的模板功能,结合使用Jinja2生成一个动态的产品网页。
1)初始化Jinja2模板引擎

import json  
import os  
import pathlib  
from robyn import Robyn, WebSocket  
from robyn.templating import JinjaTemplate  app = Robyn(__file__)  
current_file_path = pathlib.Path(__file__).parent.resolve()  
jinja_template = JinjaTemplate(os.path.join(current_file_path, "templates"))

2)编写html模板文件

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <title>{{name}}</title>  
</head>  
<body>  
<h2>Robyn Product Assistant</h2>  
<hr />  
<div id="product_info">  <h3>{{name}}</h3>  
</div>
</body>  
</html>

3)编写产品信息路由函数

@app.get("/product/:product_id")  
async def product_info(request,path_params):  product_id = path_params["product_id"]  if product_id in product_list:  product = product_list[product_id]  return jinja_template.render_template("product.html", **product)  else:  return "404 Not Found"

3、智能助理部分

智能助理部分包括嵌入在产品信息页面中的Javascript websocket 客户端和利用Robyn的WebSocket技术编写的服务端两个部分。
1)智能助理服务端帮助函数

# 用于根据产品信息产生咨询结果,这里可以通过连接大模型获得更好的咨询结果
def gen_response(msg, product):  if '价格' in msg:  return f"{product['name']}现在只需要{product['price']}美元哦。"  elif '颜色' in msg:  return f"{product['name']}有多种颜色,包括{product['color']}。"  elif '尺寸' in msg:  return f"{product['name']}的屏幕尺寸是{product['size']}。"  elif '配送' in msg:  return f"{product['name']}的配送时间大约是{product['delivery']}。"  else:  return "抱歉,我不太明白您的意思。"  # 用于统计当前的咨询人数  
def update_customer_count(count, global_dependencies):  customer_count = global_dependencies.get("customer_count", 0)  new_count = count + customer_count  global_dependencies["customer_count"] = new_count  return new_count

2)智能助理服务端
我们在客户端建立和关闭连接时广播一次咨询人数,并通过使用query_params来判断当前用户所咨询的产品信息,最后根据用户发送的消息来生成咨询响应结果。

pa = WebSocket(app, "/pa")  @pa.on("connect")  
def connect(ws, global_dependencies):  new_count = update_customer_count(1, global_dependencies)  ws.sync_broadcast(json.dumps({  "type": "customer_count",  "msg": new_count  }))  @pa.on("close")  
def close(ws, global_dependencies):  new_count = update_customer_count(-1, global_dependencies)  ws.sync_broadcast(json.dumps({  "type": "customer_count",  "count": new_count  }))  @pa.on("message")  
def message(ws, msg, global_dependencies):  product_id = ws.query_params.get("id",None)  if product_id and len(msg)>0:  ws.sync_broadcast(json.dumps({  "type": "response",  "msg": gen_response(msg, product_list.get(product_id))  }))

3)Javascript websocket 客户端
我们在产品信息的html页面中加入以下代码作为智能助理的客户端部分。

<div>  <span id="online_count">0</span>人正在咨询。  <textarea id="msg" placeholder="请输入您需要了解的内容,如颜色、尺寸、价格、配送方式等。" cols="50" rows="8"></textarea><br />  <button onclick="send()">发送消息</button>  <hr />  <h3>消息记录</h3>  <div id="messages" style="list-style-type: none; padding: 0;"></div>  
</div>  
<script>  const ws = new WebSocket("ws://0.0.0.0:8080/pa?id={{id}}");  ws.onmessage = (event) => {  const rep = JSON.parse(event.data)  if (rep.type === 'customer_count') {  document.getElementById("online_count").innerText = rep.msg;  }else{  addMessage('Robyn', rep.msg);  }  };  function send() {  const input = document.getElementById("msg");  ws.send(input.value);  addMessage('You', input.value);  input.value = "";  }  function addMessage(user,message) {  const msg_div = document.createElement("div");  msg_div.innerHTML = `<strong>${user}:</strong><br /> ${message}`;  msg_list = document.getElementById("messages");  msg_list.insertBefore(msg_div, msg_list.firstChild);  }  
</script>

这样一个基于Robyn WebSocket的简易产品智能助理就完成了,在实际的应用中可以通过使用连接池以及Redis分布式推送以提升其性能,通过与大模型API进行整合以提升其智能,从而形成一个真正的智能助理。

相关文章:

Robyn高性能Web框架系列06:使用WebSocket实现产品智能助理

使用WebSocket实现产品智能助理 WebSocket原理与应用场景Robyn的WebSocket基本使用1、创建WebSocket服务2、侦听WebSocket事件3、向客户端发送消息4、向客户端广播消息5、使用查询参数6、主动关闭连接 示例&#xff1a;简易的产品智能助理1、产品数据部分2、产品信息部分3、智能…...

UDP 缓冲区

UDP 有接收缓冲区&#xff0c;没有发送缓冲区 引申问题 1、为什么没有发送缓冲区&#xff1f; 直接引用原文 “因为 UDP 是不可靠的&#xff0c;它不必保存应用进程的数据拷贝&#xff0c;因此无需一个真正的发送缓冲区” 2、没有发送缓冲区的情况下&#xff0c;sendto 的数…...

物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践

在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;已从概念走向现实&#xff0c;成为连接物理世界与数字世界的关键桥梁。它通过将日常物品、工业设备等“物”嵌入传感器、软件及其他技术&#xff0c;使其能够通过网络相互连接并交换数据&#xff0c;从…...

【甲方安全视角】开源的安全悖论

文章目录 安全的充分必要条件&#xff1a;从「符号化信任」到「验证驱动安全」构建与分发的不可信链条迭代与审计的节奏错位代码透明与攻击面的对等暴露对普通用户的建议选择可信项目与品牌始终通过官方渠道获取软件注意权限与环境安全对“签名请求”、“连接钱包”等敏感操作保…...

GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径

在人工智能技术浪潮的推动下&#xff0c;GEO生成式引擎优化已跃升为行业技术演进与产业发展相融合的核心赛道。通过系统性梳理其发展脉络&#xff0c;我们可清晰勾勒出技术突破与产业变革交织的演进轨迹&#xff0c;其发展进程包含以下重要节点。 2023年4月&#xff0c;GPT-4发…...

【unity游戏开发——网络】计算机网络中的三种数据管理模型(分散式、集中式、分布式)和三大通信模型(C/S、B/S、P2P)

注意&#xff1a;考虑到热更新的内容比较多&#xff0c;我将热更新的内容分开&#xff0c;并全部整合放在【unity游戏开发——网络】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、数据管理模型1、分散式 (Decentralized - 各管各的)2、集中式 (Centra…...

MR30分布式 IO在物流堆垛机的应用

在现代物流行业蓬勃发展的浪潮中&#xff0c;物流堆垛机作为自动化仓储系统的核心设备&#xff0c;承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势&#xff0c;极大地提升了仓储空间利用率和货物周转效率。然而&#xff0c;随着物流行业的高速发展&#…...

香港维尔利健康科技集团推出AI辅助医学影像训练平台,助力医护人才数字化转型

香港维尔利健康科技集团近日正式发布其自主研发的“AI辅助医学影像训练平台&#xff08;V-MedTrain&#xff09;”&#xff0c;这一创新平台的上线&#xff0c;标志着医学影像教育迈入智能化辅助教学新时代。依托人工智能与大数据分析技术&#xff0c;香港维尔利健康科技集团在…...

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五)

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷&#xff08;五&#xff09; 第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&#xff08;可以培训有答案&#xff09;任务 2&#xff1a;通信数据分析取…...

基于 Python 的批量文件重命名软件设计与实现

在工作过程中,经常有很多文件,想要对文件名进行批量改名,特此写了一个程序,以实现此功能。 一、批量文件重命名软件设计原理 (一)核心原理阐述 批量文件重命名软件的核心原理在于运用操作系统提供的文件管理功能,借助编程手段达成对文件名称的批量修改。在这个软件里,…...

【深度学习新浪潮】什么是上下文工程?

什么是上下文工程? 上下文工程(Context Engineering) 是指通过设计、优化与大语言模型(LLM)交互时的输入内容(即“上下文”),引导模型生成更符合预期、更精准回答的系统性方法。这里的“上下文”通常包括 提示词(Prompt)、示例(Few-Shot Examples)、历史对话记录、…...

逆向入门(8)汇编篇-rol指令的学习

还是那个题&#xff0c;这回又碰到个循环左移&#xff0c;有挺多操作方法之前都没有系统的学&#xff0c;用到的时候再看看感觉还挺好&#xff0c;不耽误事 0x00 基本介绍 ROL(Rotate Left): 循环左移&#xff0c;它有两个操作数&#xff1a; 第一个操作数是目标操作数&#…...

Fisco Bcos学习 - 开发第一个区块链应用

文章目录 一、前言二、业务场景分析&#xff1a;简易资产管理系统三、智能合约设计与实现3.1 存储结构设计3.2 接口设计3.3 完整合约代码 四、合约编译与Java接口生成五、SDK配置与项目搭建5.1 获取Java工程项目5.2 项目目录结构5.3 引入Web3SDK5.4 证书与配置文件 六、业务开发…...

黑马python(十六)

目录&#xff1a; 1.JSON数据格式的转换 2.pyecharts模块简介 3.pyecharts入门使用 4.数据准备 5.生成折线图 1.JSON数据格式的转换 2.pyecharts模块简介 官方网站&#xff1a; 画廊网站:有更多的图标形式 测试是否安装 3.pyecharts入门使用 运行会生成一个html的文件&a…...

完成国产化替代!昆明卷烟厂用时序数据库 TDengine 重塑工业时序数据平台

小T导读&#xff1a;昆明卷烟厂作为红云红河烟草&#xff08;集团&#xff09;有限责任公司的重要组成部分&#xff0c;是集团卷烟生产的核心工厂。早期在建设制造执行系统&#xff08;MES&#xff09;时&#xff0c;其采用了 Wonderware 平台的时序数据存储功能模块&#xff0…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | BackgroundSlider(背景滑块)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— BackgroundSlider组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> …...

Wpf的Binding

前言 wpf的Binding就像一个桥梁&#xff0c;它的作用就是连接逻辑层与界面层&#xff0c;既能够把逻辑层的数据搬到界面层展示&#xff0c;又能将界面层的数据更改后传递到逻辑层&#xff0c;Binding的数据来源就是Binding的源&#xff0c;数据展示的地方就是Binding的目标。 …...

Redis—持久化

持久化 在mysql当中&#xff0c;有4个比较关心的特性&#xff0c;分别是原子性、一致性、隔离性和持久性。这里的持久性和持久化是一回事。我们该如何判断是否具有持久性呢&#xff1f;答案就是看重启进程或者主机之后&#xff0c;数据是否存在。当我们把数据存储在硬盘上是就…...

Spring Boot中日志管理与异常处理

以下是Spring Boot中日志管理与异常处理的系统化实践指南&#xff0c;结合最佳实践与核心配置&#xff0c;确保应用健壮性与可维护性。 &#x1f4ca; 一、日志管理核心配置 默认框架与级别控制 Logback 是Spring Boot默认日志框架&#xff0c;通过application.yml快速配置&…...

基于MATLAB的BP神经网络的心电图分类方法应用

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 心电图&#xff08;ECG&#xff09;是临床诊断心血管疾病的重要工具&#xff0c;能够反映心脏电活动的周期性变化。…...

【笔记】Docker 配置阿里云镜像加速(公共地址即开即用,无需手动创建实例)

2025年06月25日记 【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记&#xff08;附 异常处理&#xff09;-CSDN博客 【笔记】解决 WSL 迁移后 Docker 出现 “starting services: initializing Docker API Proxy: setting up docker ap” 问题…...

Java 中LinkedList 总结

406.根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高…...

微信小程序 / UNIAPP --- 阻止小程序返回(顶部导航栏返回、左 / 右滑手势、安卓物理返回键和调用 navigateBack 接口)

目录 理解page-container的原理 设置禁止点击遮盖层关闭&#xff1f; 阻止左滑返回 理解page-container的原理 page-container组件的所有属性&#xff0c;最重要的是show值。在页面上引入这个组件后&#xff0c;若show值为true&#xff0c;页面上所有各种方式触发的返回操作…...

Linux基本指令篇 —— mv指令

在Windows中我们经常使用CtrlX和CtrlV将一个地方的文件或目录移动到另一个地方&#xff0c;我们若是要在Linux当中完成此操作&#xff0c;则需要使用mv指令。mv 是 Linux 系统中用于移动或重命名文件和目录的基本命令之一&#xff0c;是 "move" 的缩写。下面将详细介…...

基于STM32的智能节能风扇的设计

基于STM32的智能节能风扇的设计 内容:1.摘要 本设计旨在解决传统风扇能耗高、功能单一的问题&#xff0c;提出一种基于STM32的智能节能风扇。通过结合温度传感器、人体红外传感器等多种传感器&#xff0c;利用STM32微控制器实现对风扇的智能控制。经过实际测试&#xff0c;该智…...

HCIA-IP路由基础

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 ​ 本篇笔记是根据B站上的视频教程整理而成&#xff0c;感谢UP主的精彩讲解&#xff01;如果需要了解更多细节&#xff0c;可以参考以下视频&#xf…...

Linux 内存管理之page cache

文章目录 一、page cache1.1 File-backed pages和Anonymous pages1.2 page cache/slab cache1.3 读/写路径1.4 脏页回写1.5 drop_caches1.6 时间局部性与空间局部性1.7 Page Cache 的两种类型1.8 关键数据结构 二、Page Cache 的产生2.1 Buffered I/O&#xff08;标准 I/O&…...

uniApp实战四:网络请求封装

文章目录 1.最终效果预览2.请求封装3.创建config配置文件4.创建api请求5.页面调用 说明&#xff1a;当前笔记基于Vue3开发&#xff0c;HbuilderX版本4.66 1.最终效果预览 2.请求封装 在util/request.js下创建js文件&#xff0c;代码如下 import config from /configconst tim…...

sentinel 自定义 dashboard 用户名密码

默认情况下&#xff0c;sentinel dashboard 用户名密码为 sentinel / sentinel &#xff0c;这里我使用重写 镜像的方式&#xff1a; // 定义 Dockerfile $ cat Dockerfile # 基于现有 Sentinel Dashboard 镜像 FROM bladex/sentinel-dashboard:1.8.4# 重新定义 ENTRYPOINT&…...

Fisco Bcos学习 - 搭建星形拓扑组网

文章目录 一、前言二、环境准备与依赖安装2.1 系统要求2.2 依赖安装 三、星形拓扑设计与节点规划四、使用build_chain.sh构建星形拓扑4.1 创建操作目录并获取脚本4.2 生成星形拓扑配置文件4.3 执行构建命令4.4 查看生成的节点文件 五、启动节点与共识验证5.1 启动所有节点5.2 查…...

深度学习入门--(二)感知机

一.感知机是什么 简单的输入和输出&#xff0c;感觉&#xff08;输入&#xff09;&#xff0c;知道&#xff08;输出&#xff0c;作出反应&#xff09; 二.简单逻辑电路 2.1与门 import numpy as np #AND def AND(X1,X2):w1,w2,thera0.5,0.5,0.7tmpX1*w1X2*w2if tmp>the…...

LeetCode 3298.统计重新排列后包含另一个字符串的子字符串数目2

给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新排列后&#xff0c;word2 是重排字符串的 前缀 &#xff0c;那么我们称字符串 x 是 合法的 。 请你返回 word1 中 合法 子字符串 的数目。 注意 &#xff0c;这个问题中的内存限制比其他题目要 小 &#xff0c;所以你…...

【nRF52832】【环境搭建 1】【ubuntu下搭建nRF52832开发环境】

本文讲述如何在 ubuntu 22.04 下开发 nRF52832. host 环境说明: $ uname -a Linux leo 6.8.0-60-generic #63~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 22 19:00:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux1. 安装软件 sudo apt install gcc-arm-none-eabisudo apt-get i…...

Django

1. Django 和 Tornado 的关系 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。Django 遵循 MVC&#xff08;模型-视图-控制器&#xff09;设计模式的一个变种&#xff0c;称为 MTV&#xff08;模型-模板-视图&#xff09;。Django 框架提供…...

51c嵌入式~CAN~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/14016935 一、CAN总线常见信号干扰问题 定位干扰原因 当总线有干扰时&#xff0c;有经验的工程师能够迅速定位&#xff0c;但是对于新手来说却很麻烦。 造成总线干扰的原因有很多&#xff0c;比如通过电磁辐射耦合到通…...

【iOS】iOS崩溃总结

【iOS】iOS崩溃总结 一、前言 之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》&#xff0c;浏览量、收藏率和点赞量还挺高&#xff0c;还被收录了&#xff0c;就想着总结一下iOS崩溃&#xff0c;这个也是在iOS面试中经常被问到的。 在 iOS 开发过程中&#xff0c;导致…...

npm 报错:“无法加载文件 ...npm.ps1,因为在此系统上禁止运行脚本” 解决方案(附执行策略说明)

在使用 npm 命令时&#xff0c;部分 Windows 用户可能会遇到如下错误&#xff1a; npm : 无法加载文件 D:\nvm4w\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https://go.microsoft.com/fwlink/?LinkID135170 中的 about_Executi…...

AES加密:为你的PDF文档加上一道钢铁防线

在数字化时代&#xff0c;确保敏感数据的安全性至关重要。加密技术在保护信息免受未经授权访问方面起着关键作用。而在众多加密标准中&#xff0c;AES&#xff08;高级加密标准&#xff09;因其强大的安全性和广泛的应用而脱颖而出。那么&#xff0c;AES加密如何应用到PDF文档中…...

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(一)

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷&#xff08;一&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书DCRS:DCFW:DCWS:WAF: 第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响…...

1688商品发布API:自动化上架与信息同步

一、1688商品发布API的核心功能与技术架构 1.1 API功能全景 1688商品发布API是1688开放平台的核心组件之一&#xff0c;支持商品信息的自动化发布、编辑、上下架及库存同步。其核心功能包括&#xff1a; 商品信息管理&#xff1a;支持商品标题、描述、价格、库存、SKU&#…...

鸿蒙ArkUI---基础组件Tabs(Tabbar)

基础页面组件 Tabs 作用&#xff1a; 快速创建Tabbar 个人理解&#xff1a; 快速的创建Tabar。 效果图&#xff1a; 代码&#xff1a;interface TabItem {icon: Resource; //未选中activeIcon: Resource; //选中name: string; //文字 }Entry Component struct Index {// st…...

50. Pow(x, n)快速幂算法

实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。此函数应将 x 作为浮点数&#xff08;意味着它可以是十进制数&#xff09;和 n 作为整数&#xff08;可以是正数、负数或零&#xff09;一起使用。 快速幂&#xff08;Expo…...

Python函数

三.函数进阶 0.定义 函数三要素&#xff1a;函数名&#xff0c;参数&#xff0c;返回值&#xff0c;其中只有函数名是必须要的&#xff0c;参数&#xff0c;返回值可以没有 语法&#xff1a; def 函数名&#xff08;参数&#xff09;&#xff1a; 函数体 return 返回值 1.…...

7.Spring框架

# spring框架Spring3.0开启了纯注解开发模式&#xff0c;使用Java类替代配置文件&#xff0c;开启了Spring快速开发赛道## 为什么要使用 **Spring** 框架&#xff1f;​ Spring 是一个轻量级应用框架&#xff0c;它提供了 IoC 和 AOP 这两个核心的功能。它的核心目的是为了…...

计算机网络-----详解HTTP协议

✏️1. 什么是HTTP HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的应⽤层协议&#xff08;所谓 “超⽂本” 的含义, 就是传输的内容不仅仅是⽂本(⽐如 html, css 这个就是⽂本), 还可以是⼀些其他的资源, ⽐如图⽚, 视频, ⾳频等⼆进制的数据&#xff09;。 HTTP 诞⽣…...

解决npm安装依赖报错ERESOLVE unable to resolve dependency tree

在使用 npm 安装项目依赖时&#xff0c;有时会遇到错误信息 “npm ERR! code ERESOLVE”&#xff0c;该错误通常发生在依赖版本冲突或者依赖解析问题时。本文将详细介绍出现这个错误的原因&#xff0c;并提供解决方法&#xff0c;确保正确安装项目依赖并避免该错误的发生。 一…...

微信小程序安卓手机输入框文字飘出输入框

最近在开发微信小程序遇到一个问题&#xff0c;安卓手机输入框文字飘出输入框&#xff0c;但是ios系统的手机则正常。 使用情景&#xff1a;做了一个弹窗&#xff0c;弹窗内是表单&#xff0c;需要填写一些信息&#xff0c;但是在填写信息时光标不显示&#xff0c;输入的内容飘…...

python网络自动化-数据格式与数据建模语言

数据格式 在Python网络运维自动化最基本是JSON、YAML和XML这3种数据格式。除了这3种常用的数据格式&#xff0c;还有一种深受网络工程师喜爱且在网络运维自动化中常用的数据承载方式——表格 需要注意的是JSON的键必须用双引号包裹&#xff0c;JSON的对象数据键值对的值和数组…...

C++ 中的 atan2 函数:深入解析与应用

在 C 编程中&#xff0c;数学计算是许多应用场景的核心&#xff0c;例如几何问题、物理模拟和游戏开发等。atan2 函数作为数学库中的一个重要工具&#xff0c;提供了比普通反正切函数更强大的功能。本文将深入解析 atan2 函数的原理、使用方法以及实际应用场景&#xff0c;并通…...

云计算-Azure Functions :构建事件驱动的云原生应用报告

云计算导论 课程研究报告 Azure Functions &#xff1a;构建事件驱动的云原生应用 摘要&#xff1a; Azure Functions 是一种无服务器解决方案&#xff0c;是由微软 Azure 平台提供的&#xff0c;可以使用户专注于业务逻辑&#xff0c;减少代码的编写&#xff0c;减少需要维护…...