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

成熟的前端vue vite websocket,Django后端实现方案包含主动断开websocket连接的实现

可参考实现方式点击进入查看

具体实现方案如下所示:

import { useWebsocketMsessageStore } from '@/stores/websocketMsessageStore.js'
import {ElMessage} from "element-plus";
import {useUserStore} from "@/stores/userStore.js";
// import pinia  from '@/stores/pinia.js'
// import { pinia_2 }  from '@/main.js'
let webSocket = null;
let isConnect = false; // 连接状态标志位
let rec = null; // 用于存储延迟重连的定时器
let base_ip_port = 'ws://ip:端口'
let msg_status = "error"
let my_msg = "WebSocket连接已关闭,正在尝试重新连接接"
// const userStore = useUserStore(pinia)
// const userStore = useUserStore()function createWebSocket(ip_port) {try {const wsUri = '/ws/msg/chatroom1/'; // WebSocket服务器地址webSocket = new WebSocket(ip_port+wsUri);initWebSocket();} catch (e) {if(webSocket === null){console.log('尝试创建连接失败,正在尝试重新连接');reConnect(base_ip_port); // 创建连接失败时触发重连}}
}
function initWebSocket() {webSocket.onopen = function (e) {console.log('WebSocket连接已打开');ElMessage({type: "success",message: "WebSocket连接已打开",duration: 3000})isConnect = true; // 更新连接状态标志位// 可以在这里启动心跳检测等逻辑...};webSocket.onclose = function (e) {const userStore = useUserStore()console.log('WebSocket连接已关闭,正在尝试重新连接');ElMessage({type: msg_status,message: my_msg,duration: 3000})isConnect = false; // 更新连接状态标志位if (userStore.userInfo.token){console.log("websocket onclose")reConnect(base_ip_port); // 连接关闭时触发重连}};webSocket.onmessage = function (event) {// 处理接收到的消息...let response_data = JSON.parse(JSON.parse(event.data).message)// 推送到piniaconst websocketMsessageStore = useWebsocketMsessageStore()if (response_data["each_groups_info"]){console.log('each_groups_info', response_data["each_groups_info"]);websocketMsessageStore.update_groups_info(response_data["each_groups_info"])}if (response_data["all_kill_chain"]){let result = JSON.parse(response_data['all_kill_chain'])console.log('all_kill_chain',result)websocketMsessageStore.update_kill_chains_data(result)}if (response_data["count_down_info"]){let count_down_info = JSON.parse(response_data['count_down_info'])console.log('count_down_info',count_down_info)websocketMsessageStore.update_count_down_info(count_down_info)}if (response_data["timestamp_zero"]){console.log('timestamp_zero',response_data['timestamp_zero'])websocketMsessageStore.update_timestamp_zero(response_data['timestamp_zero'])}if (response_data["persons_info"]){console.log('persons_info',response_data['persons_info'])websocketMsessageStore.update_person_info(response_data['persons_info'])}if (response_data["FindDataimage2zht"]){console.log('FindDataimage2zht',response_data["FindDataimage2zht"]);websocketMsessageStore.update_sarData(response_data['FindDataimage2zht']);};};webSocket.onerror = function (e) {console.log('WebSocket连接发生错误,正在尝试重新连接');ElMessage({type: "error",message: "WebSocket连接发生错误,正在尝试重新连接",duration: 3000})isConnect = false; // 更新连接状态标志位reConnect(base_ip_port); // 连接错误时触发重连};
}
// 外部直接调用这个进行websocket连接
export const reConnect = (ip_ports)=> {base_ip_port = ip_portsconsole.log("websocket链接")if (isConnect) return; // 如果已经连接上则不再重连if (rec) clearTimeout(rec); // 清除之前的重连定时器(如果存在)rec = setTimeout(function () {createWebSocket(base_ip_port); // 延迟一段时间后尝试重新建立连接}, 5000); // 设置延迟时间为10秒(可根据实际需求调整)
}// 向服务器发送消息
const sendMsg = (msg)=> {webSocket.send(msg)
}
// 外部直接调用这个主动关闭websocket连接
export const closeConn = (args="wss://ip:端口", msg="已主动关闭WebSocket连接")=> {// 向服务端发送断开连接webSocket.close();msg_status = "success"my_msg = msgbase_ip_port = args// ElMessage({//   type: "success",//   message: msg,//   duration: 3000// })
}
// 模拟当前任务数,随机生成的
function getRandomInt(min, max) {return Math.floor(Math.random() * (max - min + 1)) + min;
}
export const sendSocketMsg = ()=>{sendMsg(JSON.stringify({text: "你好啊",counts: getRandomInt(0, 10)}))
}

连接webosocket的函数:reConnect 。断开连接websocket的函数:closeConn

http://www.xdnf.cn/news/1985.html

相关文章:

  • 企业部署Power BI 报表服务器,在第三方系统嵌套该报表服务器,并实现单点登录
  • 【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?
  • 基于Java,SpringBoot,Vue,HTML宠物相亲配对婚恋系统设计
  • 【Python数据库与后端开发】从ORM到RESTful API
  • Dubbo(76)Dubbo的服务注册与发现机制是怎样的?
  • c#接口_抽象类_多态学习
  • RabbitMQ 复习总结
  • 【MFC】 VS2022打开低版本的MFC,双击.rc文件,DIalog加载失败,页面弹窗fatal error RC***:cannot open*****
  • Matplotlib高阶技术全景解析(续):动态交互、三维可视化与性能优化
  • 大模型助力嘉兴妇幼:数据分类分级的智能化飞跃
  • 7.11 Python CLI开发实战:API集成与异步处理核心技术解析
  • flume整合kafka
  • electron-builder 打包安装与启动手动安装,最终解决方案,之前的文章与其他的人都不用看了。
  • 驱动开发硬核特训 · Day 20:深入理解电源管理机制与实战演练
  • ValidatorUtils工具
  • uni-app云开发总结
  • SQL进阶知识:九、高级数据类型
  • Dify依赖管理poetry切换为uv
  • Kafka和Spark-Streaming
  • 解释两个 Django 命令 makemigrations和migrate
  • 【器件专题1——IGBT第2讲】IGBT 基本工作原理:从结构到特性,一文解析 “电力电子心脏” 的核心机制
  • 5.6 Microsoft Semantic Kernel:专注于将LLM集成到现有应用中的框架
  • Pycharm(十六)面向对象进阶
  • 深度解析 Java 泛型通配符 `<? super T>` 和 `<? extends T>`
  • 使用功能包组织C++节点的具体教程
  • 天能资管(SkyAi):精准投资匹配,定制资产配置新体验
  • 202531读书笔记|《天上大风:良宽俳句·短歌·汉诗400》——我别无他物款待君,除了山中冬日寂寥,陶然共一醉,不知是与非,一饱百情足,一酣万事休
  • AI重塑职场:人机协同时代的组织变革与管理创新
  • AWS Glue ETL设计与调度最佳实践
  • 【HTTP/2:信息高速公路的革命】