vue使用websocket及封装过程

 更新时间:2023年10月23日 08:36:53   作者:姥姥家的饭  
这篇文章主要介绍了vue使用websocket及封装过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue使用websocket及封装

创建websocket.js

const WSS_URL = `wss://wss.xxxx.com/ws?appid=xxx`
let Socket = ''
let setIntervalWesocketPush = null

 // 建立连接
export function createSocket() {
  if (!Socket) {
    console.log('建立websocket连接')
    Socket = new WebSocket(WSS_URL)
    Socket.onopen = onopenWS
    Socket.onmessage = onmessageWS
    Socket.onerror = onerrorWS
    Socket.onclose = oncloseWS
  } else {
    console.log('websocket已连接')
  }
}
// 打开WS之后发送心跳
export function onopenWS() {
  sendPing() //发送心跳
}
// 连接失败重连
export function onerrorWS() {
  clearInterval(setIntervalWesocketPush)
  Socket.close()
  createSocket() //重连
}
// WS数据接收统一处理
export function onmessageWS(e) {
  window.dispatchEvent(new CustomEvent('onmessageWS', {
    detail: {
      data: e
    }
  }))
}
/**发送数据
 1. @param eventType
 */
export function sendWSPush(eventTypeArr) {
  const obj = {
    appId: 'airShip',
    cover: 0,
    event: eventTypeArr
  }
  if (Socket !== null && Socket.readyState === 3) {
    Socket.close()
    createSocket() //重连
  } else if (Socket.readyState === 1) {
    Socket.send(JSON.stringify(obj))
  } else if (Socket.readyState === 0) {
    setTimeout(() => {
      Socket.send(JSON.stringify(obj))
    }, 3000)
  }
}
/**关闭WS */
export function oncloseWS() {
  clearInterval(setIntervalWesocketPush)
  console.log('websocket已断开')
}
/**发送心跳 */
export function sendPing() {
  Socket.send('ping')
  setIntervalWesocketPush = setInterval(() => {
    Socket.send('ping')
  }, 5000)
}

组件中调用

import { createSocket, sendWSPush } from './api/websocket'

createSocket() //创建
sendWSPush(11111) //发送数据


// 事件监听  如果websockte有反应触发"this.getDataFunc"方法
window.addEventListener('onmessageWS', this.getDataFunc)

//根据需要,销毁事件监听(不然会创建多个监听事件,发一次通告提示好几次)
window.removeEventListener('onmessageWS', this.getDataFunc)

methods: {
	getDataFunc(e) {
		console.log(e)
	}
}

vue使用WebSocket连接

在store里面新建ws.js文件

export default {
  state: {
    webst: null,
    WSMessage: null,
    WSStatus: null
  },
  mutations: {
    /**
      * @description 建立websocket连接
      * @param  state vuex state
      * @param  webst webSocket对象
      */
    setConnect (state, webst) {
      state.webst = webst
    },
    /**
      * @description websocket消息
      * @param  state vuex state
      * @param  message webSocket消息
      */
    setMessage (state, message) {
      state.WSMessage = message
    },
    /**
      * @description 设置websocet的状态
      * @param  state vuex state
      * @param  message webSocket消息
      */
    setWSStatus (state, status) {
      state.WSStatus = status
    }
  },
  actions: {
    /**
     *  @description 开启websocket连接
     */
    connect ({ state, commit, dispatch, rootState }, { token }) {
      return new Promise((resolve, reject) => {
        const wsurl = 'websocket连接地址'
        const webs = new WebSocket(wsurl)
        // 客户端接收服务端数据时触发
        webs.onmessage = (e) => {
          commit('setWSStatus', 'success')
          commit('setMessage', e.data)
          // 进行操作...
        }
        // 建立连接时触发
        webs.onopen = (e) => {
          commit('setWSStatus', 'open')
        }
        // 通信发生错误时触发
        webs.onerror = (e) => {
          state.webst.close()
          commit('setWSStatus', 'error')
        }
        // 连接关闭时触发
        webs.onclose = (e) => {
          commit('setWSStatus', 'closed')
        }
        resolve(webs)
      })
    },
    /**
     *  @description 关闭websocket
     */
    close ({ state, commit, dispatch, rootState }) {
      if (state.webst) {
        state.webst.close()
        commit('setWSStatus', 'closed')
        commit('setMessage', null)
        commit('setConnect', null)
      }
    }
  }
}

登录时和退出时调用

// 登录
   dispatch('connect', null, { root: true })

// 退出登录
  dispatch('close', null, { root: true })

展示效果

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Element-ui tree组件自定义节点使用方法代码详解

    Element-ui tree组件自定义节点使用方法代码详解

    本文通过实例代码给大家介绍了Element-ui tree组件自定义节点使用方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Nuxt使用Vuex的方法示例

    Nuxt使用Vuex的方法示例

    这篇文章主要介绍了Nuxt使用Vuex的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 前端框架Vue.js构建大型应用浅析

    前端框架Vue.js构建大型应用浅析

    这篇文章主要为大家详细介绍了前端框架Vue.js构建大型应用的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • vue实现树形菜单效果

    vue实现树形菜单效果

    这篇文章主要为大家详细介绍了vue实现树形菜单效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Vuex提升学习篇

    Vuex提升学习篇

    本篇文章主要介绍了Vuex提升学习篇,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Vue+Element UI实现概要小弹窗的全过程

    Vue+Element UI实现概要小弹窗的全过程

    弹窗效果是我们日常开发中经常遇到的一个功能,下面这篇文章主要给大家介绍了关于Vue+Element UI实现概要小弹窗的相关资料,需要的朋友可以参考下
    2021-05-05
  • 详解element-ui级联菜单(城市三级联动菜单)和回显问题

    详解element-ui级联菜单(城市三级联动菜单)和回显问题

    这篇文章主要介绍了详解element-ui级联菜单(城市三级联动菜单)和回显问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 解决el-date-picker日期选择控件少一天的问题

    解决el-date-picker日期选择控件少一天的问题

    这篇文章主要介绍了解决el-date-picker日期选择控件少一天的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue 插值 v-once,v-text, v-html详解

    vue 插值 v-once,v-text, v-html详解

    这篇文章主要介绍了vue 插值 v-once,v-text, v-html详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • vue3+element 分片上传与分片下载功能实现方法详解

    vue3+element 分片上传与分片下载功能实现方法详解

    这篇文章主要介绍了vue3+element 分片上传与分片下载功能实现方法,结合实例形式详细分析了vue3+element 分片上传与下载相关实现技巧与操作注意事项,需要的朋友可以参考下
    2023-06-06

最新评论