鸿蒙APP采用WebSocket实现在线实时聊天
本文配套视频:
鸿蒙APP基于websocket实时聊天功能_哔哩哔哩_bilibili
1. 案例环境:
- 鸿蒙APP采用ArkTS语法编写,API14环境,DevEco Studio 5.0.7.210编辑器开发
- 后台接口基于SpringBoot,后台前端基于Vue开发
- 核心技术采用 WebSocket 进行通讯
2. 主要实现功能:
- 实时聊天
- 在线实时状态检测(后台断线,APP端可实时显示状态)
3. 运行实测效果图如下:
说明:
- APP端和后台客服可以进行实时聊天
- APP端顶部[在线客服]旁边有个绿色图标,表示连接正常,如果后台关闭了,则连接不正常,这个图标会立马变成灰色,后台服务恢复正常后,该图标会立马变成绿色状态
- 后台客服可以主动连接和断开连接
4. APP端代码如下:
import webSocket from '@ohos.net.webSocket';
import CommonConstants from '../../common/CommonConstants';
import { tokenUtils } from '../../common/TokenUtils';
import Logger from '../../common/utils/Logger';
import { myTools } from '../../common/utils/MyTools';
import { Header } from '../../component/Header';
import { ChatModel } from '../../model/chat/ChatModel';//执行websocket通讯的对象
let wsSocket = webSocket.createWebSocket()/*** 在线客服-页面*/
@Entry
@Component
struct ChatPage {//当前登录人的用户ID@State userId: number = -1;//要发送的信息@State sendMsg: string = ''//ws服务端地址@State wsServerUrl: string = "ws://" + CommonConstants.SERVER_IP + ":" + CommonConstants.SERVER_PORT + "/webSocket/"//与后台 WebSocket 的连接状态@State connectStatus: boolean = falsescroller: Scroller = new Scroller()//是否绑定了事件处理程序eventHandleBinded: boolean = false@State intervalID: number = 0;//消息集合@State messageList: Array<ChatModel> = [];//检查连接状态checkStatus() {if (!this.connectStatus) {wsSocket.connect(this.wsServerUrl + this.userId).then((value) => {}).catch((e: Error) => {this.connectStatus = false; //连接状态不可用});}wsSocket.send('heartbeat').then((value) => {}).catch((e: Error) => {this.connectStatus = false; //连接状态不可用})}aboutToAppear(): void {this.userId = tokenUtils.getUserInfo().id as number;this.connect2Server();//重复执行(此处注意:setInterval里面如果需要使用this的话,就必须使用匿名函数的写法,否则取不到值)this.intervalID = setInterval(() => {this.checkStatus();Logger.debug('WebSocket连接状态=' + this.connectStatus)}, 2000);}build() {Row() {Column() {Stack() {Header({ title: '在线客服', showBack: true, backgroundColorValue: '#ffffff' })Image($r('app.media.svg_connectStatus')).fillColor(this.connectStatus ? '#1afa29' : '#cccccc').width(20).offset({ x: -75 })}//展示消息区域Scroll(this.scroller) {//展示消息Column({ space: 30 }) {ForEach(this.messageList, (item: ChatModel) => {if (item.role == 'ai') {//客服展示在左侧Column({ space: 10 }) {//消息时间Row() {Text(item.createTime).fontSize(11).fontColor('#cccccc')}.padding({ left: 13 }).justifyContent(FlexAlign.Center).width('100%')//消息和头像Row({ space: 5 }) {//头像Image(item.avatar).width(45).height(45).borderRadius(3)//消息Text(item.text).fontSize(14).width('60%').padding(12).backgroundColor('#2c2c2c').fontColor('#ffffff').borderRadius(6)}.padding({ left: 13 }).justifyContent(FlexAlign.Start).width('100%')}.width('100%')} else {//用户自己展示在右侧Column({ space: 10 }) {//消息时间Row() {Text(item.createTime).fontSize(11).fontColor('#cccccc')}.padding({ right: 13 }).justifyContent(FlexAlign.Center).width('100%')//消息和头像Row({ space: 5 }) {//消息Text(item.text).fontSize(14).width('60%').padding(12).backgroundColor('#1afa29').fontColor('#141007').borderRadius(6)//头像Image(item.avatar).width(45).height(45).borderRadius(3)}.padding({ right: 13 }).justifyContent(FlexAlign.End).width('100%')}.width('100%')}})}.width('100%').padding({ top: 20, bottom: 20 })}.align(Alignment.Top).layoutWeight(1).flexGrow(1).scrollable(ScrollDirection.Vertical).scrollBar(BarState.On).scrollBarWidth(5)//发送消息输入框Flex({ justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) {TextInput({ text: this.sendMsg, placeholder: "请输入消息..." }).flexGrow(1).borderRadius(1).onChange((value) => {this.sendMsg = value})Button("发送", { type: ButtonType.Normal, stateEffect: true }).enabled(this.connectStatus).width(90).fontSize(17).margin({ left: 5 }).flexGrow(0).onClick(() => {if (!this.sendMsg) {myTools.alertMsg('发送消息不能为空!');return;}this.sendMsg2Server()})}.width('100%').padding(3)}.width('100%').justifyContent(FlexAlign.Start).height('100%')}.height('100%').padding({ top: CommonConstants.TOP_PADDING, bottom: CommonConstants.BOTTOM_PADDING })}//发送消息到服务端sendMsg2Server() {wsSocket.send(this.sendMsg).then((value) => {}).catch((e: Error) => {this.connectStatus = false; //连接状态不可用})this.scroller.scrollEdge(Edge.Bottom);this.sendMsg = ''; //清空消息}//连接服务端connect2Server() {this.bindEventHandle()wsSocket.connect(this.wsServerUrl + this.userId).then((value) => {}).catch((e: Error) => {this.connectStatus = false; //连接状态不可用});}
}
5. 后台接口核心代码如下:
package cn.wujiangbo.WebSocket.server;import cn.hutool.core.util.ObjectUtil;
import cn.wujiangbo.WebSocket.config.GetHttpSessionConfig;
import cn.wujiangbo.WebSocket.pojo.ClientInfoEntity;
import cn.wujiangbo.WebSocket.pojo.IM;
import cn.wujiangbo.domain.app.AppUser;
import cn.wujiangbo.service.app.AppUserService;
import cn.wujiangbo.util.DateUtils;
import cn.wujiangbo.util.SpringContextUtil;
import com.aliyun.oss.ServiceException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;
import javax.annotation.PostConstruct;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** <p>该类负责监听客户端的连接、断开连接、接收消息、发送消息等操作。</p>*/
@Slf4j
@Component
@CrossOrigin(origins = "*")
@ServerEndpoint(value = "/webSocket/{userId}", configurator = GetHttpSessionConfig.class)
public class WebSocketServer {/*** key:客户端连接唯一标识(用户ID)* value:ClientInfoEntity*/private static final Map<Long, ClientInfoEntity> uavWebSocketInfoMap = new ConcurrentHashMap<Long, ClientInfoEntity>();//默认连接2小时private static final int EXIST_TIME_HOUR = 2;AppUserService appUserService;//客服头像地址(替换成网络可访问的图片地址即可)private String CUSTOMER_IAMGE = "";/*** 连接建立成功调用的方法** @param session 第一个参数必须是session* @param sec* @param userId 代表客户端的唯一标识*/@OnOpenpublic void onOpen(Session session, EndpointConfig sec, @PathParam("userId") Long userId) {if (uavWebSocketInfoMap.containsKey(userId)) {throw new ServiceException("token已建立连接");}//把成功建立连接的会话在实体类中保存ClientInfoEntity entity = new ClientInfoEntity();entity.setUserId(userId);entity.setSession(session);//默认连接N个小时entity.setExistTime(LocalDateTime.now().plusHours(EXIST_TIME_HOUR));uavWebSocketInfoMap.put(userId, entity);//之所以获取http session 是为了获取获取 httpsession 中的数据 (用户名/账号/信息)System.out.println("WebSocket 连接建立成功,userId=: " + userId);}/*** 当断开连接时调用该方法*/@OnClosepublic void onClose(Session session, @PathParam("userId") Long userId) {// 找到关闭会话对应的用户 ID 并从 uavWebSocketInfoMap 中移除if (ObjectUtil.isNotEmpty(userId) && uavWebSocketInfoMap.containsKey(userId)) {uavWebSocketInfoMap.remove(userId);System.out.println("WebSocket 连接关闭成功,userId=: " + userId);}}/*** 接受消息* 这是接收和处理来自用户的消息的地方。我们需要在这里处理消息逻辑,可能包括广播消息给所有连接的用户。*/@OnMessagepublic void onMessage(Session session, @PathParam("userId") Long userId, String message) throws IOException {log.info("接收到来自 [" + userId + "] 的消息:" + message);//如果是心跳检测的话,直接返回success即可表示,后台服务是正常状态if ("heartbeat".equals(message)) {this.sendUserMessage(userId, "success");return;}ClientInfoEntity entity = uavWebSocketInfoMap.get(userId);if (entity == null) {this.sendUserMessage(userId, "用户在线信息错误!");return;}IM im = new IM();if (userId != -1) {appUserService = SpringContextUtil.getBean(AppUserService.class);AppUser user = appUserService.getById(userId);if (user == null) {this.sendUserMessage(userId, "用户信息不存在!");return;}im.setRole("user");//user表示APP用户发的消息im.setUsername(user.getNickName());im.setAvatar(user.getUserImg());} else {im.setRole("ai");//ai表示后台客服发的消息im.setUsername("人工客服");im.setAvatar(CUSTOMER_IAMGE);}im.setUid(userId);im.setCreateTime(DateUtils.getCurrentDateString());im.setText(message);//只要接受到客户端的消息就进行续命(时间)entity.setExistTime(LocalDateTime.now().plusHours(EXIST_TIME_HOUR));uavWebSocketInfoMap.put(userId, entity);String jsonStr = new ObjectMapper().writeValueAsString(im); // 处理后的消息体this.sendMessage(jsonStr);}/*** 处理WebSocket中发生的任何异常。可以记录这些错误或尝试恢复。*/@OnErrorpublic void onError(Throwable error) {log.error("报错信息:" + error.getMessage());error.printStackTrace();}private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");/*** 发送消息定时器* 开启定时任务,每隔N秒向前台发送一次时间*/@PostConstruct
// @Scheduled(cron = "0/59 * * * * ? ")public void refreshDate() {//当没有客户端连接时阻塞等待if (!uavWebSocketInfoMap.isEmpty()) {//超过存活时间进行删除Iterator<Map.Entry<Long, ClientInfoEntity>> iterator = uavWebSocketInfoMap.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<Long, ClientInfoEntity> entry = iterator.next();if (entry.getValue().getExistTime().compareTo(LocalDateTime.now()) <= 0) {log.info("WebSocket " + entry.getKey() + " 已到存活时间,自动断开连接");try {entry.getValue().getSession().close();} catch (IOException e) {log.error("WebSocket 连接关闭失败: " + entry.getKey() + " - " + e.getMessage());}//过期则进行移除iterator.remove();}}sendMessage(FORMAT.format(new Date()));}}/*** 群发信息的方法** @param message 消息*/public void sendMessage(String message) {System.out.println("给所有APP用户发送消息:" + message + ",时间:" + DateUtils.getCurrentDateString());//循环客户端map发送消息uavWebSocketInfoMap.values().forEach(item -> {//向每个用户发送文本信息。这里getAsyncRemote()解释一下,向用户发送文本信息有两种方式,// 一种是getBasicRemote,一种是getAsyncRemote//区别:getAsyncRemote是异步的,不会阻塞,而getBasicRemote是同步的,会阻塞,由于同步特性,第二行的消息必须等待第一行的发送完成才能进行。// 而第一行的剩余部分消息要等第二行发送完才能继续发送,所以在第二行会抛出IllegalStateException异常。所以如果要使用getBasicRemote()同步发送消息// 则避免尽量一次发送全部消息,使用部分消息来发送item.getSession().getAsyncRemote().sendText(message);});}/*** 给指定用户发送消息*/public void sendUserMessage(Long userId, String message) throws IOException {System.out.println("给APP用户 [" + userId + "] 发送消息:" + message + ",时间:" + DateUtils.getCurrentDateString());ClientInfoEntity clientInfoEntity = uavWebSocketInfoMap.get(userId);if (clientInfoEntity != null && clientInfoEntity.getSession() != null) {if (clientInfoEntity.getSession().isOpen()) {clientInfoEntity.getSession().getBasicRemote().sendText(message);}}}}
6. 规划
目前实现的功能非常有限,仅仅是一个基础的Demo,后面会基于这个出版,做一些迭代开发,规划如下:
- 后台客服聊天页面,做一个APP端用户列表,可以选择和指定的用户聊天
- APP端做一个好友列表,然后好友之间可以互相聊天
- 支持发送基本的表情
有兴趣的可以加入!
相关文章:
鸿蒙APP采用WebSocket实现在线实时聊天
本文配套视频: 鸿蒙APP基于websocket实时聊天功能_哔哩哔哩_bilibili 1. 案例环境: 鸿蒙APP采用ArkTS语法编写,API14环境,DevEco Studio 5.0.7.210编辑器开发后台接口基于SpringBoot,后台前端基于Vue开发核心技术采用…...
【2步解决】phpstudy开机自启(自动启动phpstudy、mysql、nignx或apache、自动打开网址)
重启执行最终效果图: 一、场景 线下部署,需要开启自动动,并打开网址http://localhost/。 二、操作步骤 ①、新建start.txt,并修改为start.bat,使用记事本编辑,粘贴上方代码如下: echo off:…...
一周学会Flask3 Python Web开发-SQLAlchemy删除数据操作-班级模块
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 首页list.html里加上删除链接: <!DOCTYPE html> <html lang"en"> <head><meta c…...
从过拟合到强化学习:机器学习核心知识全解析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
uniapp-x 之useAttrs只读
数据类型: useAttrs在web端拿到的是obj,app拿到的是map 是否可以修改内部元素: 否,只读 这意味着你想这样写代码将会无效 let attrsuseAttrs();console.log("attrs",attrs, attrs instanceof Map)//appif(attrs ins…...
MySQL 8 主从同步安装与配置
拟机,由 CentOS 换成了 Ubuntu,用 Xteminal 连接之后,为了方便改配置文件,把文件权限改成 666 了,结果因为这个调半天,一直以为是网络问题或者是配置问题。要注意为了防止配置文件被未经授权的用户修改&…...
【人工智能】人工智能安全(AI Security)
人工智能安全(AI Security) 是指保障人工智能系统免受各种攻击、滥用和错误操作的措施与技术。随着人工智能的广泛应用,AI的安全性问题变得越来越重要。AI安全不仅关注系统本身的稳定性与安全性,还涉及到如何确保AI的决策和行为是…...
Shp文件转坐标并导出到Excel和JSON(arcMap + excel)
思路总结: 准备: 一个shp文件 (单个面, 多个面建议使用Python代码, 自己弄太复杂) 使用arcMap工具, 将面通过 要素折点转点 工具转为点 Shp文件转坐标 (Python) 第一步: 这样就得到了一个点文件. 第二步: 得到x, y坐标 使用工具添加xy坐标 这样在属性表中就会多出两列 第…...
【数据结构】线性表简介
0.本篇问题 线性表,顺序表,链表什么关系?它们是逻辑结构还是存储结构?线性表的基本操作有哪些? 线性表是具有相同数据元素的有限序列。 表中元素有先后次序,每个元素占有相同大小的存储空间。 一、线性…...
基于FPGA的制冷型红外成像电路设计(论文+图纸)
1.总体设计 对于本次课题基于FPGA的制冷型红外成像电路设计,其主要包括两个功能,第一就是红外图像的显示,第二就是红外图像中各点温度的测量。首先对于红外图像的显示来说,一般根据红外探测器根据阵列的大小可以显示出不同的清…...
Spring Boot 集成 Lua 脚本:实现高效业务逻辑处理
1. 前言 1.1 什么是Lua Lua是一种轻量级、高性能的脚本语言,常用于游戏开发、嵌入式系统、配置文件解析等领域。Lua语法简洁,易于学习和使用,且具有强大的扩展性。 1.2 Spring Boot与Lua集成的意义 将Lua集成到Spring Boot应用中,可以实现动态配置业务逻辑、简化复杂业…...
cursor使用
引入私有文档 设置-> Features->下滑找到Docs url后边多加一个 / 可以拉取url下所有的页面(子页面,子目录),不加只拉取url当前页面 使用 选择 Docs 回车 选择 文档 直接解析链接 链接 回车 搜索引擎 web 对比git版本差异 git 选择其中一个 g…...
时间序列预测(十九)——卷积神经网络(CNN)在时间序列中的应用
有关CNN的介绍可以参考以下博文: 卷积神经网络(CNN)详细介绍及其原理详解-CSDN博客 三万字硬核详解:卷积神经网络CNN(原理详解 项目实战 经验分享)_cnn卷积神经网络-CSDN博客 CNN笔记:通俗…...
uniapp-x js 限制
1.String(str) 不允许,android模拟室报错,找不到String 2.JSON.parse不接受泛类型 export const genData function<T> (initData:T) : T {return JSON.parse<T>(JSON.stringify(initData))!;//不可以,必须明确类型 } error: …...
Matlab 基于磁流变阻尼器的半主动车辆座椅悬架模糊控制研究
1、内容简介 略 Matlab 175-基于磁流变阻尼器的半主动车辆座椅悬架模糊控制研究 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
QQuick3D-Model的实例化
QQuick3D-Model的实例化 Model的实例化 Model类继承于Node类;如果想让一个Model(模型)可以渲染,至少需要一个Mesh(网格)和material(材质)Mesh(网格):Qt内置了矩形(Rectangle&#…...
二分算法刷题
1. 初识 总结:二分算法题的细节非常多,容易写出死循环。使用算法的条件不一定是数组有序,而是具有“二断性”;模板三种后面会讲。 朴素二分二分查找左端点二分查找右端点 2. 朴素二分 题目链接:704. 二分查找 - 力扣…...
# RAG 框架 # 一文入门 全链路RAG系统构建与优化 —— 架构、策略与实践
本文全面阐述了RAG系统从数据收集、数据清洗(包括领域专有名词处理)、智能数据分块与QA对生成,到向量化、向量数据库选择与配置,再到检索方式及重排序,直至整合输出、监控反馈和安全保障的全流程。通过这一完整方案&am…...
网络运维学习笔记(DeepSeek优化版) 017 HCIA-Datacom综合实验02
文章目录 综合实验2sw3sw4gwcore1(sw1)core2(sw2)ISP 综合实验2 sw3 vlan 2 stp mode stp int e0/0/1 port link-type trunk port trunk allow-pass vlan 2 int e0/0/2 port link-type trunk port trunk allow-pass vlan 2 int e…...
Flutter——Android与Flutter混合开发详细教程
目录 1.创建FlutterModule项目,相当于Android项目里面的module库;2.或者编辑aar引用3.创建Android原生项目3.直接运行跑起来 1.创建FlutterModule项目,相当于Android项目里面的module库; 2.或者编辑aar引用 执行 flutter build a…...
java手机号、邮箱、日期正则表达式
Java正则核心API Java中用 java.util.regex 包的两个类: Pattern:编译正则表达式Matcher:执行匹配操作 1. 验证手机号 String regex "1[3-9]\\d{9}"; boolean isValid "18812345678".matches(regex); // true2. 提取…...
0x04.若依框架微服务开发(含AI模块运行)
微服务本地开发硬件资源有限,所以会将核心微服务组件先部署在服务器上比如:mysql,redis,注册中心Nacos,网关Gateway,认证中心Auth和upms模块以及低代码生成模块。 mysql、redis部署前篇已讲,这…...
数据库管理-第302期 国产类RAC架构数据库网络连接方式(20250314)
数据库管理302期 2025-03-14 数据库管理-第302期 国产类RAC架构数据库网络连接方式(20250314)1 Oracle RAC2 DMDSC3 YAC4 KES RAC总结 数据库管理-第302期 国产类RAC架构数据库网络连接方式(20250314) 作者:胖头鱼的鱼…...
ctf web入门知识合集
文章目录 01做题思路02信息泄露及利用robots.txt.git文件泄露dirsearch ctfshow做题记录信息搜集web1web2web3web4web5web6web7web8SVN泄露与 Git泄露的区别web9web10 php的基础概念php的基础语法1. PHP 基本语法结构2. PHP 变量3.输出数据4.数组5.超全局变量6.文件操作 php的命…...
CSS3-流星雨
1. 绘制标签 <div class"container"><span></span> </div>2. 设置div背景 在百度上搜索一幅星空的图片 <style>* {/* 初始化 */margin: 0;padding: 0;}body {/* 高度100% */height: 100vh;/* 溢出隐藏 */overflow: hidden;}.contai…...
【leetcode hot 100 199】二叉树的右视图
解法一:层级遍历,右侧看到的节点就是每一层最后一个元素 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }…...
Unity进阶课程【二】Mask 组件的使用 UI遮罩效果以及透明抠图效果
Unity组件讲解 Mask 时隔多年,今天咱们继续进阶课程,这几年变化很大,但是一直还是从事Unity行业,行业虽难,依旧坚持,以后会养成习惯,定期更新,希望小伙伴们监督,有想学习…...
本地部署Jina AI Reader:用Docker打造你的智能解析引擎
本地部署Jina AI Reader:用Docker打造你的智能解析引擎 🌟 引言:为什么需要本地部署?📌 场景应用图谱🔧 部署指南(Linux环境)1. 环境准备2. Docker部署3. 验证服务状态 🚀…...
【MyBatis Plus 逻辑删除详解】
文章目录 MyBatis Plus 逻辑删除详解前言什么是逻辑删除?MyBatis Plus 中的逻辑删除1. 添加逻辑删除字段2. 实体类的配置3. 配置 MyBatis Plus4. 使用逻辑删除5. 查询逻辑删除的记录 MyBatis Plus 逻辑删除详解 前言 MyBatis Plus 是一个强大的持久化框架…...
Unity--GPT-SoVITS接入、处理GPTAPI的SSE响应流
GPT-SoVITS GPT-SoVITS- v2(v3也可以,两者对模型文件具有兼容) 点击后 会进入新的游览器网页 ----- 看了一圈,发现主要问题集中在模型的训练很需要CPU,也就是模型的制作上,问题很多,如果有现有…...
一次Linux下 .net 调试经历
背景: Xt160Api, 之前在windows下用.net调用,没有任何问题。 但是移植到Linux去后,.net程序 调用 init(config_path) 总是报错 /root/test 找不到 traderApi.ini (/root/test 是程序目录) 然后退出程序 解决过程: 于是考虑是不是参数传错了&…...
Manus 技术探索 - 使用 gVisor 在沙箱内运行 Ubuntu 容器并通过远程浏览器访问
在容器化技术中,gVisor 为运行不信任的工作负载提供了额外的安全隔离。本文将详细介绍如何利用 gVisor 运行带 GUI 的 Ubuntu 容器,并通过 VNC/NoVNC 实现远程浏览器访问,从而轻松控制容器内的桌面环境。 1. 安装 gVisor 如果你还没有安装 …...
PentestGPT 下载
PentestGPT 下载 PentestGPT 介绍 PentestGPT(Penetration Testing GPT)是一个基于大语言模型(LLM)的智能渗透测试助手。它结合了 ChatGPT(或其他 GPT 模型)与渗透测试工具,帮助安全研究人员自…...
Day07 -实例 非http/s数据包抓取工具的使用:科来 wrieshark 封包监听工具
引入:由于我们day06正确为模拟器配置好了抓包环境,现在用bp去抓取模拟器web包是可以抓取到的,但是某些小程序 & pc端的app 都是有走非http/https协议的数据包的,那么我们就需要用不同的工具去抓取这些其他协议的数据包。 工具…...
机器学习 [白板推导](三)[线性分类]
4. 线性分类 4.1. 线性分类的典型模型 硬分类:输出结果只有0或1这种离散结果; 感知机线性判别分析 Fisher 软分类:会输出0-1之间的值作为各个类别的概率; 概率生成模型:高斯判别分析GDA、朴素贝叶斯,主要…...
c# 查找相似颜色算法
下是一个基于欧几里得距离的C#颜色相似度查找算法实现,包含详细注释和优化策略: using System; using System.Collections.Generic;public class ColorMatcher {// 颜色容器 - 使用字典存储颜色ID到RGB的映射private readonly Dictionary<int, byte[]> _colorDictiona…...
【数据分析】读取文件
3. 读取指定列 针对只需要读取数据中的某一列或多列的情况,pd.read_csv()函数提供了一个参数:usecols,将包含对应的columns的列表传入该参数即可。 上面,我们学习了读取 "payment" 和 "items_count" 这…...
全星研发管理APQP软件系统:助力汽车零部件企业高效研发,打造核心竞争力
在竞争日益激烈的汽车零部件行业,产品质量和研发效率直接影响企业的生存与发展。APQP(先期产品质量策划)作为行业的研发管理框架,能够有效提升产品质量和研发效率。然而,传统的APQP管理方式往往面临流程繁琐、信息分散…...
ccf3501密码
//密码 #include<iostream> #include<cstring> using namespace std; int panduan(char a[]){int lstrlen(a);int s0;int zm0,sz0,t0;int b[26]{0},c[26]{0},d[10]{0},e0,f0;while(s<l&&l>6){if(a[s]<Z&&a[s]>A){b[a[s]-A];zm;}if(a[s…...
kali之netdiscover
kali之netdiscover Netdiscover 是 Kali Linux 中一款用于网络发现和主机扫描的工具。它通过主动发送 ARP 请求来识别局域网中的活动主机,并显示它们的 IP 地址、MAC 地址和网卡厂商信息。Netdiscover 特别适用于局域网内的主机发现和网络映射。 1. Netdiscover 的…...
Leetcode-2272. Substring With Largest Variance [C++][Java]
目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-2272. Substring With Largest Variancehttps://leetcode.com/problems/substring-with-largest-variance/description/2272. 最大波动的子字符串 - 力扣(LeetCode)2272. 最大波动的子字符串…...
【AI】技术人如何系统学习AI大模型应用开发?
从理论认知到全栈落地的完整指南 一、认知突破:理解大模型的技术本质(1-2周) 1.1 基础理论筑基 必学内容 大模型演进脉络:从Transformer到GPT-4的技术跃迁核心机制解析:注意力机制、位置编码、自监督学习关键能力边界…...
级联树SELECTTREE格式调整
步骤: 1、将全部列表设置成Map<Long, List<Obejct>> map的格式,方便查看每个父级对应的子列表,减少循环次数 2、对这个map进行递归,重新进行级联树的集合调整,将子集放置在对应的childs里面。 public Dyna…...
深入理解静态与动态代理设计模式:从理论到实践
静态代理设计模式 1.为什么需要代理设计模式? javaEE分层开发中,哪个层次对于我们来讲最重要 DAO---->Service---->Controller JavaEE分层中,最为重要的是Service层 Service层包含了那些代码 Service层核心功能(几十行 上百代码) 额外…...
NET进行CAD二次开发之二
本文主要针对CAD 二次开发入门与实践:以 C# 为例_c# cad-CSDN博客的一些实践问题做一些补充。 一、DLL介绍 在 AutoCAD 中,accoremgd.dll、acdbmgd.dll 和 acmgd.dll 都是与.NET API 相关的动态链接库,它们在使用.NET 语言(如 C#、VB.NET)进行 AutoCAD 二次开发时起着关…...
PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码
以下是一个使用 PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码。该代码包含训练和可视化部分,假设输入为图片和 4 个工艺参数,根据这些输入生成相应的图片。 1. 导入必要的库 import …...
c#:使用Modbus RTU协议
Modbus是一种广泛应用于工业自动化领域的通信协议,支持多种传输方式,如RTU、TCP等。其中,Modbus RTU是一种基于串行通信的协议,具有高效、可靠的特点。本文将详细介绍Modbus RTU协议的基本原理,并重点解析功能码0x03&a…...
设计模式(行为型)-备忘录模式
目录 定义 类图 角色 角色详解 (一)发起人角色(Originator) (二)备忘录角色(Memento) (三)备忘录管理员角色(Caretaker)…...
基于yolo11+flask打造一个精美登录界面和检测系统
这个是使用flask实现好看登录界面和友好的检测界面实现yolov11推理和展示,代码仅仅有2个html文件和一个python文件,真正做到了用最简洁的代码实现复杂功能。 测试通过环境: windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.…...
【软考-架构】13.1、软件架构概述-构件技术
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 ✨【重点】系统架构设计软件架构概述软件架构设计与生命周期构件🌟软件架构风格数据流风格调用/返回风格独立构件风格虚拟机风格仓库风格闭环控制风格C2体系结…...