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

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

具体实现方案如下所示:

js 复制代码
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

相关推荐
林太白2 分钟前
NestJS企业级登录注册如何做
前端·javascript·后端
cong_5 分钟前
🔥 我的开源项目火了!竟被各个公众号转发
前端·后端·github
五号厂房10 分钟前
React 中如何使用自定义Hook封装可复用逻辑
前端
icefiresong2411 分钟前
使用 Node.js 和 Git 自动化部署项目
前端
码云之上12 分钟前
聊聊MCP Client及其实践
前端·架构·mcp
dasseinzumtode14 分钟前
ECharts 保留 tooltip.trigger: 'axis'的情况下 实现markPoint tooltip独立自定义悬浮框 功能
前端·echarts
小小小小宇15 分钟前
前端实现图片的上传、缩放、旋转、移动和裁剪
前端
Timo来了15 分钟前
上传图片后预览图片小试
前端
精通搬砖能手15 分钟前
简单实现MVVM框架,轻上手,简单易懂
前端
小桥风满袖16 分钟前
Three.js-硬要自学系列16 (贝塞尔曲线应用、组合曲线、路径管道、旋转成型、轮廓填充)
前端·css·three.js