websocket

websocket及时通讯代替轮询

websocket的直接使用

data() {
  // socket对象
  socket: null,
  config: {
    heartbeat: {
      enabled: true, // 是否发送心跳包
      time: 10000, // 心跳包发送间隔时长
      setInterval: null // 心跳包计时器
    },
    reconnect: {
      lockReconnect: false,
      setTimeout: null, // 计时器对象
      time: 3000, // 重连间隔时间
      number: 50 // 重连次数
    }
  }
}

mounted() {
  // 加载websocket
  this.loadWebsocket()
},

methods: {
  // WebSocket代替轮询
  loadWebsocket() {
    const that = this
    let _token = getToken()
    _token = _token.split(' ')[1]
    that.socket = new WebSocket(
      `${this.$configApiUrl.WebSocket_URL}?token=${_token}`
    )
    that.socket.onerror = (evt) => {
      console.log('webSocket连接失败!')
    }
    that.socket.onopen = (evt) => {
      that.heartbeat()
      console.log('webSocket连接成功!')
    }
    that.socket.onmessage = (evt) => {
    }
    that.socket.onclose = (evt) => {
      if (that.config.heartbeat.enabled) {
        clearInterval(that.config.heartbeat.setInterval)
      }

      if (evt.code === 1006) {
        that.reconnect()
      }
      console.log('webSocket关闭!')
    }
  },
  /**
   * WebSocket心跳检测
   */
  heartbeat() {
    const that = this
    that.config.heartbeat.setInterval = setInterval(function () {
      that.socket.send('heartbeat')
    }, that.config.heartbeat.time)
  },
  /**
   * WebSocket断开重连方法
   */
  reconnect() {
    const that = this
    if (
      that.config.reconnect.lockReconnect ||
      that.config.reconnect.number === 0
    ) {
      return
    }

    that.config.reconnect.lockReconnect = true

    // 没连接上会一直重连,设置延迟避免请求过多
    that.config.reconnect.setTimeout &&
      clearTimeout(that.config.reconnect.setTimeout)

    that.config.reconnect.setTimeout = setTimeout(() => {
      that.loadWebsocket()

      that.config.reconnect.lockReconnect = false

      that.config.reconnect.number--

      const number = that.config.reconnect.number
      console.log(`网络连接已断开,正在尝试重新连接(${number}S)...`)
    }, that.config.reconnect.time)
  }
}

封装websocket

创建一个单独的socket.js文件

import { getToken } from '@/utils/token'
const SOCKET_URL = 'ws://XXX.XXX.XX.XX:XXX/socket.io'

let socket = null
let result = ''
const socketconfig = {
  heartbeat: {
    enabled: true, // 是否发送心跳包
    time: 10000, // 心跳包发送间隔时长
    setInterval: null // 心跳包计时器
  },
  reconnect: {
    lockReconnect: false,
    setTimeout: null, // 计时器对象
    time: 3000, // 重连间隔时间
    number: 50 // 重连次数
  }
}
export function loadWebsocket() {
    let _token = getToken()
    _token = _token.split(' ')[1]
    socket = new WebSocket(
      `${SOCKET_URL}?token=${_token}`
    )
    socket.onopen = function () {
        heartbeat()
        console.log('公共的websocket连接成功')
    }
    socket.onerror = (evt) => {
      console.log('webSocket连接失败!')
    }
    socket.onmessage = (evt) => {
      result = JSON.parse(evt.data)
    }
    socket.onclose = function (evt) {
      // 关闭 websocket
      console.log('连接已关闭...')
      if (socketconfig.heartbeat.enabled) {
        clearInterval(socketconfig.heartbeat.setInterval)
      }

      if (evt.code === 1006) {
        reconnect()
      }
  }
}
/**
   * WebSocket心跳检测
   */
export function heartbeat() {
  socketconfig.heartbeat.setInterval = setInterval(function () {
    socket.send('heartbeat')
  }, socketconfig.heartbeat.time)
}
/**
   * WebSocket断开重连方法
   */
export function reconnect() {
  if (socketconfig.reconnect.lockReconnect || socketconfig.reconnect.number === 0) {
    return
  }

  socketconfig.reconnect.lockReconnect = true

  // 没连接上会一直重连,设置延迟避免请求过多
  socketconfig.reconnect.setTimeout &&
    clearTimeout(socketconfig.reconnect.setTimeout)

  socketconfig.reconnect.setTimeout = setTimeout(() => {
    loadWebsocket()

    socketconfig.reconnect.lockReconnect = false

    socketconfig.reconnect.number--

    const number = socketconfig.reconnect.number
    console.log(`网络连接已断开,正在尝试重新连接(${number}S)...`)
  }, socketconfig.reconnect.time)
}
export function onmessageCallBack() {
  return result
}

在组件里引用

import { loadWebsocket, onmessageCallBack } from '@/utils/socket'

// 在登录后调loadWebsocket连接socket,在发送消息之类的事件后调onmessageCallBack处理数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值