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

news2025/4/26 19:25:48

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

具体实现方案如下所示:

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)
    // 推送到pinia
    const 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_ports
  console.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 = msg
  base_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.coloradmin.cn/o/2343486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海之淀攻略

家长要做的功课 家长可根据孩子情况,需要做好以下功课: 未读小学的家长:了解小学小升初派位初中校额到校在读小学的家长:了解小升初派位初中校额到校在读初中的家长:了解初中校额到校 越是高年级的家长,…

PCIe具体解释分析

参考文章 PCIe总线详解_STATEABC-GitCode 开源社区 https://zhuanlan.zhihu.com/p/652808759 PCI总线学习(一):PCI总线结构-CSDN博客 PCI——第1章——PCI总线的基本知识-CSDN博客 计算机中register、cache、memory的区别 - Lines Blog 什么是内存管理单元&#xff…

Golang | 迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象(如列表、树等集合结构)中元素的方法,而无需暴露其底层实现细节。通过将遍历逻辑与集合本身解耦,迭代器模式使…

使用命令行加密混淆C#程序

C#作为托管语言编译生成的IL中间代码极易被反编译工具还原源码。据统计,超过83%的商业软件曾遭遇过代码逆向风险,导致核心算法泄露、授权被跳过. 因此对于C#语言开发的程序来说, 在发布前进行混淆和加密非常有必要. 本文主要介绍如何使用恒盾C#混淆加密…

当智驾成标配,车企暗战升级|2025上海车展

文|刘俊宏 编|王一粟 智能化无处不在的2025年上海车展,回归了卖车的初衷。 光锥智能在展会暴走两天,最大的感触是今年的车展少了争奇斗艳,多了些许务实。 回顾智能汽车时代的三场重要车展。2023年的上海车展充满了…

在网上找的资料怎样打印出来?

在数字化时代,我们经常需要从互联网上获取各种资料,无论是学术论文、工作文档还是学习资料。然而,如何高效地将这些网上的资料打印出来,却是一个值得探讨的问题。本文将为您提供一个全面的解决方案,帮助您轻松完成网上…

算法训练营 Day1

努力追上那个曾经被寄予厚望的自己 —— 25.4.25 一、LeetCode_26 删除有序数组中的重复项 给你⼀个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现⼀次 ,返回删除后数组的 新⻓度。元素的 相对顺序 应该保持 ⼀致 …

【linux】Chrony服务器

简介 1.1 时间的重要性 由于 IT 系统中,准确的计时非常重要,有很多种原因需要准确计时: 在网络传输中,数据包括和日志需要准确的时间戳 各种应用程序中,如订单信息,交易信息等 都需要准确的时间戳 1.2 时区…

技术视界 | 数据的金字塔:从仿真到现实,机器人学习的破局之道

在人工智能的世界里,有一个共识正逐渐达成——谁掌握了数据,谁就掌握了未来。 尤其是在机器人技术迅速演进的今天,“如何让机器人理解世界、学习操作”这一问题的根源,越来越回归到数据本身。正如一座金字塔般,不同层…

wsl联通外网

在C:\Users<你的用户名>下&#xff0c;新建.wslconfig文件添加如下配置&#xff08;具体配置参考官方文档&#xff09;&#xff1a; # Settings apply across all Linux distros running on WSL 2 [wsl2]# Limits VM memory to use no more than 4 GB, this can be set …

shadcn/radix-ui的tooltip高度定制arrow位置

尝试了半天&#xff0c;后来发现&#xff0c;不支持。。。。。就是不支持 那箭头只能居中 改side和align都没用&#xff0c;下面有在线实例 https://codesandbox.io/p/sandbox/radix-ui-slider-forked-zgn7hj?file%2Fsrc%2FApp.tsx%3A69%2C21 但是呢&#xff0c; 第一如果…

【专题刷题】二分查找(二)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

C++_数据结构_详解红黑树

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&…

数据结构手撕--【二叉树】

目录 定义结构体&#xff1a; 初始化&#xff1a; 手动创建一个二叉树&#xff1a; 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历 二叉树节点个数&#xff1a; 叶子节点个数&#xff1a; 二叉树第k层节点个数&#xff1a; 二叉树的高度&#xff1a; 查找值为x…

.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架

文章目录 引言Xamarin 起源&#xff1a;MAUI 的前身Xamarin 的创立&#xff08;2011年&#xff09;Xamarin Studio 与 Visual Studio 集成&#xff08;2013年&#xff09;Xamarin.Forms 的诞生&#xff08;2014年&#xff09;微软收购Xamarin&#xff08;2016年&#xff09; .N…

多模态大语言模型arxiv论文略读(四十)

The Wolf Within: Covert Injection of Malice into MLLM Societies via an MLLM Operative ➡️ 论文标题&#xff1a;The Wolf Within: Covert Injection of Malice into MLLM Societies via an MLLM Operative ➡️ 论文作者&#xff1a;Zhen Tan, Chengshuai Zhao, Raha M…

【蓝桥杯选拔赛真题104】Scratch回文数 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 scratch回文数 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C++资料 scratch回文数 第十五届青少年蓝桥杯scratch编…

OpenWrt 与 Docker:打造轻量级容器化应用平台技术分享

文章目录 前言一、OpenWrt 与 Docker 的集成前提1.1 硬件与内核要求1.2 软件依赖 二、Docker 环境部署与验证2.1 基础服务配置2.2 存储驱动适配 三、容器化应用部署实践3.1 资源限制策略3.2 Docker Compose 适配 四、性能优化与监控4.1 容器资源监控4.2 镜像精简策略 五、典型问…

C++初阶----模板初阶

引言 什么是模板 模板是泛型编程的基础&#xff0c;泛型编程是以一种独立于任何特定类型的方式编写代码。 模板也是创建泛型类或者函数的蓝图。 如&#xff1a;库容器&#xff0c;迭代器和算法&#xff0c;都是泛型编程的例子 1. 泛型编程 首先&#xff0c;我们应该了解什么是…

网络流量分析 | 流量分析基础

流量分析是网络安全领域的一个子领域&#xff0c;其主要重点是调查网络数据&#xff0c;以发现问题和异常情况。本文将涵盖网络安全和流量分析的基础知识。 网络安全与网络中的数据 网络安全的两个最关键概念就是&#xff1a;认证&#xff08;Authentication&#xff09;和授…