vue全局websocket连接,心跳和监听,在全局可以调用开启或者关闭

ws全局使用

登陆后开启ws连接 login.vue

import { mapActions } from 'vuex';
methods: {
    ...mapActions('websocket', ['onopenWebSocket']),
    userlogin() {//登陆成功方法
	    this.$store.dispatch('onopenWebSocket',{
	        id:'1',//携带参数
        })
   	}

关闭ws连接 APP.vue

beforeDestroy() {
	this.$store.dispatch('disconnectWebSocket')
},
destroyed() {
 	this.$store.dispatch('disconnectWebSocket')
},

ws方法

store/modules/websocket.js文件代码

let socket = null;
let timer = null;

export default {
  state: {
    message: null,
    sellerid: '',
    account: '',
    close: false,
    time: 60000,
  },
  mutations: {
    //开启
    SOCKET_ONOPEN (state, info) {
      console.log('开启WebSocket连接', info);
      // 开启心跳定时器
      timer = setInterval(() => {
        info.workerID = localStorage.getItem('workerID')
        info.connectionID = localStorage.getItem('connectionID')
        info.id = localStorage.getItem('id')
        info.HEARTBEAT_TIME = parseInt(new Date().getTime() / 1000);
        console.log('info信息', { ...info });
        if (info.connectionID && info.workerID) {
          console.log('发送心跳信息', { ...info });
          socket.send(JSON.stringify(info));// 发送心跳消息
        } else {
          console.log('未发送心跳信息', { ...info });
        }
      }, state.time);
    },
    // 关闭
    SOCKET_ONCLOSE (state, event) {
      console.log('WebSocket连接已关闭');
      if (state.close) {//浏览器关闭
        clearInterval(timer);// 关闭心跳定时器
        socket.send('close');// 发送心跳消息
      } else {//连接错误 || 服务器连接已关闭 || 收到消息返回信息不对
        this.commit('againRequest')
      }
    },
    // 收到消息
    SOCKET_ONMESSAGE (state, message) {
      state.message = message;
      console.log('收到消息:', message);
      if ((message && message.workerID) || message.workerID == 0) localStorage.setItem('workerID', message.workerID)
      if ((message && message.connectionID || message.connectionID == 0)) localStorage.setItem('connectionID', message.connectionID)
      if (message.success != 'HEARTBEAT_OK') {//返回的字段success为HEARTBEAT_OK代表请求成功
        console.log('收到消息---需要重连');
        this.commit('againRequest')
      }
    },
    // 连接错误
    SOCKET_ONERROR (state, event) {
      console.error('WebSocket连接错误:', event);
      this.commit('againRequest')
    },
    // 重新开启ws
    againRequest (state) {
      console.log('重新开启ws');
      clearInterval(timer);// 关闭心跳定时器
      localStorage.removeItem('workerID')
      localStorage.removeItem('connectionID')
      setTimeout(() => {
        this.dispatch('onopenWebSocket', {
          id:'1'
        });
      }, state.time)
    }
  },
  actions: {
    // 创建WebSocket连接
    onopenWebSocket ({ state, commit }, data) {
      let hasExecuted = false;
      state.id= data.id;
      socket = new WebSocket(`ws://地址?id=${data.id}`);
      // 监听WebSocket事件
      socket.onopen = (event) => {
        console.log('监听WebSocket事件-----连接ws', event);
        commit('SOCKET_ONOPEN', { id: state.sellerid });
      };
      socket.onclose = (event) => {
        console.log('监听WebSocket事件-----关闭ws', event);
        if (!hasExecuted) {
          commit('SOCKET_ONCLOSE', event);
          hasExecuted = true;
        }
      };
      socket.onmessage = (event) => {
        commit('SOCKET_ONMESSAGE', JSON.parse(event.data));
      };
      socket.onerror = (event) => {
        console.log('监听WebSocket事件-----连接ws错误');
        if (!hasExecuted) {
          commit('SOCKET_ONERROR', event);
          hasExecuted = true;
        }
      };
    },
    // 关闭浏览器  关闭WebSocket连接
    disconnectWebSocket ({ state }) {
      if (socket) {
        state.close = true
        socket.send(JSON.stringify('close'));// 发送心跳消息
        socket.close();
      }
    }
  }
};

store/index.js

import websocket from './modules/websocket';
modules: {
  websocket
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue是一款流行的JavaScript框架,用于构建用户界面。它提供了一套响应式的数据驱动视图组件,以及强大的工具和插件生态系统。 要在Vue全局监听一个WebSocket连接并接收数据,我们可以使用Vue的插件机制来实现。 首先,我们需要创建一个WebSocket插件。在该插件中,我们会在Vue实例中注册一个全局事件监听器来接收数据。插件代码可以如下所示: ```javascript const WebSocketPlugin = { install(Vue, options) { // 创建WebSocket连接 const socket = new WebSocket(options.url); // 监听WebSocket的打开事件 socket.addEventListener('open', () => { console.log('WebSocket连接已打开'); }); // 监听WebSocket的错误事件 socket.addEventListener('error', (error) => { console.error('WebSocket连接出现错误', error); }); // 监听WebSocket的消息事件 socket.addEventListener('message', (event) => { // 将收到的消息作为一个全局事件触发 Vue.prototype.$globalBus.$emit('websocketMessage', event.data); }); // 在Vue实例中注册全局事件 Vue.prototype.$globalBus = new Vue(); } }; export default WebSocketPlugin; ``` 接下来,我们需要在Vue的入口文件(比如main.js)中安装该插件: ```javascript import Vue from 'vue'; import App from './App.vue'; import WebSocketPlugin from './WebSocketPlugin.js'; Vue.use(WebSocketPlugin, { url: 'ws://example.com/websocket' // WebSocket服务器的URL }); new Vue({ render: h => h(App) }).$mount('#app'); ``` 现在我们就可以在Vue组件中监听全局事件来接收WebSocket的数据了。在组件中,我们可以使用`$globalBus.$on`方法来监听事件,并在回调函数中处理接收到的数据,例如: ```javascript export default { created() { // 监听全局事件 this.$globalBus.$on('websocketMessage', this.handleWebSocketMessage); }, methods: { handleWebSocketMessage(data) { // 处理收到的WebSocket数据 console.log('收到WebSocket数据:', data); } } }; ``` 至此,我们就成功地在Vue中实现了全局监听WebSocket连接并接收数据的功能。无论在哪个组件中,只要监听全局事件,都能接收到WebSocket的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值