vue中全局websocket

1、创建 websocket.js 文件

// 定义 websocket
export default {
 ws: {},
 setWs: function(newWs) {
  this.ws = newWs
 },
}
2、在main.js 中引入
import wsk from './utils/websocket.js' // 引入 websocket
Vue.prototype.$wsk = wsk // 挂载
3、在App.vue组件或者父组件中初始化 websocket

-data中参数:
    ws: null,
   leave_page: false,
   is_first_in_page: true, // 判断是否是第一次进入页面,在 websocket 连接成功时判断是否调用子路由

-methods 方法
  // 初始化 websocket
  initWebSocket() {
   if ('WebSocket' in window) {
    let url = `ws链接`
    this.ws = new WebSocket(url)
    this.ws.onopen = () => {
     this.$wsk.setWs(this.ws) // 连接成功后,赋值给全局对象 websocket
     console.log('连接 websocket 成功')
     if (this.is_first_in_page) return
     setTimeout(() => {
      console.log('重新调用组件中的方法进行发送信息')
      this.send_data()
     }, 100)
    }
    this.ws.onclose = e => {
     console.log('监听到websocket断开', e)
     // 如果是离开页面或者刷新的情况下,则不做重连,否则重连
     if (this.leave_page) {
      console.log('断开连接', e)
     } else {
      console.log('正在重连中')
      this.is_first_in_page = false // 设置为 false, 这样重连后就会调用组件中的方法来订阅信息
      this.initWebSocket()
     }
    }
   } else {
    // 浏览器不支持 WebSocket
    alert('您的浏览器不支持 WebSocket,建议使用谷歌浏览器')
   }
   setTimeout(() => {
    // 其他代码块
    return this.send_data()
   }, 100)
  },
  // 发送消息
  send_data() {
   let data = {
    type: 'send_data',
   }
   this.$wsk.ws.send(JSON.stringify(data))
   this.$wsk.ws.onmessage = this.websocketonmessage
  },
websocketonmessage(e){
    console.log(e) // 接受消息
}

-destroyed 方法
this.leave_page = true
  this.ws.close()
  this.ws = null
  this.$wsk.setWs(this.ws)

 

posted @ 2022-03-14 14:13  yw3692582  阅读(1865)  评论(0编辑  收藏  举报