Vue 2 中 WebSocket 模块实现与应用(包含心跳检测、自动重连)

这篇具有很好参考价值的文章主要介绍了Vue 2 中 WebSocket 模块实现与应用(包含心跳检测、自动重连)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WebSocket 模块实现与应用

WebSocket 技术是一种在 Web 开发中常用的实时通信方式,它允许客户端和服务器之间建立持久性的双向连接,以便实时地传输数据。在 Vue.js 项目中,使用 WebSocket 可以轻松实现实时消息推送、即时通讯等功能。在这篇博客中,我们将介绍一个基于 Vue.js 的 WebSocket 模块的实现,并讨论其功能、作用以及应用方式。

废话不多说,先提供代码

// 在 store 中创建一个模块(WebSocket 模块)
import {Notification} from 'element-ui';
import {getToken} from "@/utils/auth";

const state = {
  ws: null,
  heartCheckTimer: null,
};

const mutations = {
  SET_WS(state, ws) {
    state.ws = ws;
    console.log("SET_WS", state.ws);
  },
  CLEAR_WS(state) {
    state.ws = null;
  },
  SET_HEART_CHECK_TIMER(state, timer) {
    state.heartCheckTimer = timer;
  },
};

const actions = {
  startWebSocket({commit, dispatch, state}) {
    if (getToken() && (!state.ws || state.ws.readyState !== WebSocket.OPEN)) {
      console.log("SOCKET_PATH:", process.env);
      const socketUrl = `${process.env.VUE_APP_SOCKET_PATH}/ws?token=${getToken()}`;
      const ws = new WebSocket(socketUrl);

      ws.onmessage = function (e) {
        console.log(`${new Date().toLocaleString()} >>>>> 收到消息 ${e.data}`, state.ws);
        if (e.data !== "pong") {
          Notification({
            type: "info",
            title: '新消息',
            message: e.data,
            position: "top-right",
            duration: 3000,
            showClose: true
          });
        }
      };

      ws.onclose = function () {
        console.log(`${new Date().toLocaleString()} >>>>> 连接已关闭`);
        // 尝试重新连接
        dispatch('reconnectWebSocket');
      };

      ws.onopen = function () {
        console.log(`${new Date().toLocaleString()} >>>>> 连接成功`, ws);
        Notification({
          type: "success",
          title: '成功',
          message: '会话连接成功',
          position: "top-right",
          duration: 3000,
          showClose: true
        });
        // 保存 WebSocket 连接信息
        commit('SET_WS', ws);
        // // 在这里调用 sendWebSocketMessage,确保 state.ws 已经被正确设置
        // 开始心跳检测
        dispatch('startHeartCheck');
      };

      ws.onerror = function (e) {
        console.log(`${new Date().toLocaleString()} >>>>> 数据传输发生异常`, e);
        Notification({
          type: "error",
          title: '错误',
          message: '会话连接异常,服务已断开',
          position: "top-right",
          duration: 3000,
          showClose: true
        });
      };
    }
  },

  sendWebSocketMessage({state}, msg) {
    console.log(`${new Date().toLocaleString()} >>>>> 发送消息:${msg}`, state.ws);
    state.ws.send(msg);
  },

  reconnectWebSocket({dispatch}) {
    dispatch('clearWebSocket');
    // 递归调用,一直尝试重连
    setTimeout(() => {
      dispatch('startWebSocket');
    }, 6000);
  },

  clearWebSocket({commit, state}) {
    if (state.ws) {
      state.ws.close();
      commit('CLEAR_WS');
    }
  },

  startHeartCheck({commit, dispatch, state}) {
    console.log(`${new Date().toLocaleString()} >>>>> 开始心跳检测`, state.ws);
    // 清除之前的计时器
    dispatch('clearHeartCheckTimer');

    // 创建新的计时器
    dispatch('sendWebSocketMessage', 'ping');
    const timer = setInterval(() => {
      if (!state.ws || state.ws.readyState !== WebSocket.OPEN) {
        console.log(`${new Date().toLocaleString()} >>>>> 心跳检测失败,触发重连`, state.ws);
        dispatch('reconnectWebSocket');
      } else {
        console.log(`${new Date().toLocaleString()} >>>>> 心跳正常,继续下一次心跳检测`, state.ws);
        dispatch('sendWebSocketMessage', 'ping');
      }
    }, 1000 * 29);
    commit('SET_HEART_CHECK_TIMER', timer);
  },

  clearHeartCheckTimer({commit, state}) {
    const timer = state.heartCheckTimer;
    timer && clearInterval(timer);
    commit('SET_HEART_CHECK_TIMER', null);
  },
};

export default {
  state,
  mutations,
  actions,
};

1. 功能概述

该 WebSocket 模块提供了以下核心功能:

WebSocket 连接管理: 通过封装 WebSocket 的创建、连接、关闭等操作,实现了 WebSocket 连接的简便管理。
消息收发: 可以方便地发送和接收 WebSocket 消息,并在收到消息时进行相应的处理。
自动重连: 当 WebSocket 连接断开时,模块会自动尝试重新连接,确保持续的通信。
心跳检测: 集成了心跳检测机制,定期向服务器发送心跳消息,以确保连接的稳定性。

2. 代码结构

该模块的代码结构如下:

State: 维护了 WebSocket 连接对象(ws)和心跳检测定时器(heartCheckTimer)的状态。
Mutations: 提供了用于修改状态的同步方法,包括设置 WebSocket 对象、清除 WebSocket 对象以及设置心跳检测定时器。
Actions: 包含了异步的业务逻辑,如启动 WebSocket 连接、发送消息、重新连接、清除连接、启动心跳检测等。

3. 应用方式

3.1 安装模块

首先,确保你的项目中已经安装了 element-ui,因为在收到新消息时,会使用 element-ui 的 Notification 组件进行通知。

npm install element-ui

3.2 引入模块

在你的 Vuex store 中引入 WebSocket 模块:

// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import webSocketModule from './modules/webSocket';

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    webSocket: webSocketModule,
    // other modules...
  },
  // other configurations...
});

3.3 启动 WebSocket 连接

在需要使用 WebSocket 的地方,通过 Vuex 的 Action 启动 WebSocket 连接:

export default {
  mounted() {
    this.$store.dispatch('startWebSocket');
  },
}

3.4 发送和接收消息

通过 Vuex Action 可以方便地发送消息,同时通过监听 WebSocket 模块的状态来处理接收到的消息:

// YourComponent.vue
export default {
  methods: {
    sendMessage(message) {
      this.$store.dispatch('sendWebSocketMessage', message);
    },
  },
  computed: {
    websocket() {
      return this.$store.state.webSocket.ws;
    },
  },
  watch: {
    websocket(newVal) {
      if (newVal) {
        newVal.onmessage = (event) => {
          // 处理接收到的消息
          console.log('Received message:', event.data);
        };
      }
    },
  },
}

4. 使用过程中遇到的一些问题

4.1 页面刷新后socket连接断开,且不再重连

通常,在页面刷新时,WebSocket 连接会被断开,因为整个应用重新加载。为了解决这个问题,你可以考虑以下方案:

监听页面刷新事件: 在页面即将刷新或关闭时,可以通过监听 beforeunload 事件来执行一些清理操作,例如关闭 WebSocket 连接。这样可以确保在页面刷新或关闭时,WebSocket 连接得到正常关闭。

 mounted() {
    this.$nextTick(() => {
      // 初始化 WebSocket 连接
      this.$store.dispatch('startWebSocket');

      // 在这里保存 this.$store 到一个变量
      const store = this.$store;

      // 在 beforeunload 事件中使用 store
      window.addEventListener('beforeunload', function (event) {
        store.dispatch('clearWebSocket');
        // 在这里执行你的操作,例如保存数据
        // const confirmationMessage = '确定要离开页面吗?';
        // event.returnValue = confirmationMessage; // Standard for most browsers
        // return confirmationMessage; // For some older browsers
      });
    })
  }

代码放在App.vue下面的mouted即可
Vue 2 中 WebSocket 模块实现与应用(包含心跳检测、自动重连),笔记,websocket

5. 总结

通过使用该 WebSocket 模块,我们可以轻松地在 Vue.js 项目中集成 WebSocket 功能,实现实时通信、消息推送等功能。模块的自动重连和心跳检测机制确保了连接的稳定性,而清晰的代码结构使得模块易于维护和扩展。在实际应用中,可以根据具体业务需求,结合 Vuex 状态管理和组件生命周期,灵活使用该模块,为项目提供更加强大的实时通信能力。

实际效果可查在线网站:https://web.yujky.cn文章来源地址https://www.toymoban.com/news/detail-780552.html

到了这里,关于Vue 2 中 WebSocket 模块实现与应用(包含心跳检测、自动重连)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么WebSocket需要前端心跳检测,有没有原生的检测机制?

    本文代码 github、gitee、npm 在web应用中,WebSocket是很常用的技术。通过浏览器的WebSocket构造函数就可以建立一个WebSocket连接。但当需要应用在具体项目中时,几乎都会进行心跳检测。 设置心跳检测,一是让通讯双方确认对方依旧活跃,二是浏览器端及时检测当前网络线路可用

    2024年02月03日
    浏览(64)
  • java webSocket服务端、客户端、心跳检测优雅解决

    项目分为三个端,项目之间需要webSocket通信。 WebSocketConfig WebSocketServer

    2024年02月17日
    浏览(41)
  • C++ Qt TCP的心跳检测机制,断线重连技术,应用层代码重新实现

    目录 前言: 一、Qt直接启动本身的KeepAlive 二、在应用层自己实现一个心跳检测  三、自定义心跳代码实现: 完整客户端服务端工程下载: 共用的结构体相关头文件:         客户端部分核心代码:         服务端部分核心代码: 运行结果展示: 前两篇关于qt tcp 相关的,

    2024年02月05日
    浏览(45)
  • Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

    Server端  Client 运行结果 Server Client 运行结果  注意: 需要调整readerIdleTime|writerIdleTime|allIdleTime参数才会显示对应超时信息 服务端 客户端(浏览器) 效果图

    2024年02月11日
    浏览(35)
  • WebSocket服务端数据推送及心跳机制(Spring Boot + VUE)

    一、WebSocket简介 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大意义。WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双

    2024年02月12日
    浏览(43)
  • websocket以及心跳机制的实现

            在浏览器与服务器通信之间,传统的http请求在某些场景下并不理想,比如实时聊天,实时性的小游戏等等, 其中面临主要的两个缺点: 无法做到消息的实时性 服务器无法主动推送信息 其基于http的主要解决方案有: 基于ajax的轮询:客户端定时或者动态相隔短时

    2024年02月04日
    浏览(40)
  • Vue3封装全局WebSocket;全局可监听、可发送、心跳处理等;

    操作如下 可以在多个页面多个组件中进行监听/发送 代码简介 方便; 首先安装 tools-javascript 以及 tools-vue3 根据你的业务需求初始化 ws 在你的任何文件中直接调用即可 附加篇(也可不读 直接看文档 )

    2024年02月11日
    浏览(42)
  • nodejs实现前后端websocket通信+心跳示例

    nodejs后端代码  server.js 直接在文件所在目录打开cmd窗口,启动服务: node server.js 浏览器端  index.html 在本地直接运行浏览器即可! 如果有帮助,就点个赞再走 ^  ^                                               

    2024年02月13日
    浏览(37)
  • Flutter:WebSocket封装-实现心跳、重连机制

    前言Permalink Flutter简介 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。同时 Flutter还使用 Nat

    2024年02月10日
    浏览(53)
  • WebSocket心跳重连在微信小程序中的实现与服务器端

    WebSocket技术是一种在浏览器和服务器之间建立持久化连接的通信协议。在微信小程序中,通过WebSocket可以实现实时的双向通信。然而,由于网络等各种因素的不稳定性,WebSocket连接可能会出现断开的情况。为了保证连接的可靠性,我们可以通过心跳机制和重连机制来处理Web

    2024年03月18日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包