美文网首页
vue连接WebSocket

vue连接WebSocket

作者: 随烟灬 | 来源:发表于2020-12-17 16:53 被阅读0次

    一、创建websocket.js文件

    let Socket = ''
    let setIntervalWesocketPush = null
    const socketUrl = ''  // socket连接地址
    /**
     * 建立websocket连接
     * @param {string} url ws地址
     */
    export const createSocket = () => {
      Socket && Socket.close()
      if (!Socket) {
        console.log('建立websocket连接')
        Socket = new WebSocket(socketUrl)
        Socket.onopen = onopenWS
        Socket.onmessage = onmessageWS
        Socket.onerror = onerrorWS
        Socket.onclose = oncloseWS
      } else {
        console.log('websocket已连接')
      }
    }
    
    /**打开WS之后发送心跳 */
    const onopenWS = () => {
      sendPing()
    }
    
    /**连接失败重连 */
    const onerrorWS = () => {
      Socket.close()
      clearInterval(setIntervalWesocketPush)
      console.log('连接失败重连中')
      if (Socket.readyState !== 3) {
        Socket = null
        createSocket(socketUrl)
      }
    }
    
    /**WS数据接收统一处理 */
    const onmessageWS = e => {
      window.dispatchEvent(new CustomEvent('onmessageWS', {
        detail: {
          data: e.data
        }
      }))
    }
    
    /**
     * 发送数据但连接未建立时进行处理等待重发
     * @param {any} message 需要发送的数据
     */
    const connecting = message => {
      setTimeout(() => {
        if (Socket.readyState === 0) {
          connecting(message)
        } else {
          Socket.send(JSON.stringify(message))
        }
      }, 1000)
    }
    
    /**
     * 发送数据
     * @param {any} message 需要发送的数据
     */
    export const sendWSPush = message => {
      if (Socket !== null && Socket.readyState === 3) {
        Socket.close()
        createSocket(socketUrl)
      } else if (Socket.readyState === 1) {
        Socket.send(JSON.stringify(message))
      } else if (Socket.readyState === 0) {
        connecting(message)
      }
    }
    
    /**断开重连 */
    const oncloseWS = () => {
      clearInterval(setIntervalWesocketPush)
      console.log('websocket已断开....正在尝试重连')
      if (Socket.readyState !== 2) {
        Socket = null
        createSocket(socketUrl)
      }
    }
    /**发送心跳
     * @param {number} time 心跳间隔毫秒 默认5000
     * @param {string} ping 心跳名称 默认字符串ping
     */
    export const sendPing = (time = 5000, ping = 'ping') => {
      clearInterval(setIntervalWesocketPush)
      Socket.send(ping)
      setIntervalWesocketPush = setInterval(() => {
        Socket.send(ping)
      }, time)
    }
    

    二、main.js全局调用

    import { createSocket } from './utils/websocket'
    createSocket()
    

    根据自己的需求选择调用的地方

    三、在需要数据的页面注册监听事件并接收数据

    this.getsocketData = (e) => {
     // 创建接收消息函数
     let data = e && e.detail.data
     if (data && data != 'ping') {
       // 接收数据的操作
     }
    }
    // 注册监听事件
    window.addEventListener('onmessageWS', this.getsocketData)
    

    相关文章

      网友评论

          本文标题:vue连接WebSocket

          本文链接:https://www.haomeiwen.com/subject/mjvzgktx.html