手写Vue的WebSocket原生插件

本文介绍了一个基于WebSocket的通信方案,包括自动重连机制及心跳包的实现细节。通过设定重连次数和间隔,确保了网络不稳定时的连接稳定性。同时,通过定期发送心跳包监测连接状态,确保了长连接的活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其中应该加上重连机制的,思路是断开之后n秒启动重连,重连就是其中执行 open方法就行,重连几次之后,如果还没有成功就关闭重连机制

import store from '@/store'
import qs from 'qs'
import {getCookieToken} from '@/utils/auth'
const {ws} = store.getters.apiConfig

class Websocket {
  message = () => {}
  opts = {
    query: {}
  }
  hbHandler = {}
  constructor (url, autoConnect) {
    this.url = url
  }
  init () { //  初始化
    this._on('open', this._connectHandler)
      ._on('message', this._messagehandler)
      ._on('close', this._disconnectHandler)
      ._on('error', this._errorHandler)
  }
  open () { //  打开WebSocket的按钮
    this.setOpenQuery({
      authToken: getCookieToken()
    })
    this.$io = new WebSocket(this._wsUrl())
    this.init()
  }
  close () { // 关闭WebSocket的按钮
    this.closeWs()
  }
  closeWs () {
    if (this.$io) {
      this.$io.close()
      clearInterval(this.hbHandler) //  定时器要关掉
      this._off('open', this._connectHandler)
        ._off('message', this._messagehandler)
        ._off('close', this._disconnectHandler)
        ._off('error', this._errorHandler)
    }
  }
  commit (action) { //  向服务端传信息,这里只用作心跳包
    let data = {action}
    this.$io && (this.$io.readyState === 1) && this.$io.send(JSON.stringify(data))
    if ((this.$io && (this.$io.readyState === 2)) || (this.$io && (this.$io.readyState === 3))) {
      this.close()
    }
  }
  _on (eventName, handler) {
    this.$io.addEventListener(eventName, handler)
    return this
  }
  _off (eventName, handler) {
    this.$io.removeEventListener(eventName, handler)
    return this
  }
  setOpenQuery (query = {}) { //  token
    this.resetOptions({query})
  }
  resetOptions (opts) {
    Object.assign(this.opts, opts)
  }
  _wsUrl () { //  这里拼接的,很low
    return this.url + '?' + qs.stringify(this.opts.query)
  }
  _connectHandler = (event) => {
    console.log('连接->正常')
    this._heartBeat()
  }
  _heartBeat () { //  心跳包
    this.hbHandler = setInterval(() => {
      this.commit('heartbeat')
    }, 10000)
  }
  _messagehandler = (event) => { // 接收到的信息
    let meg = JSON.parse(event.data)
    meg.data && this.message(meg.data) // 这里是执行的事件,需要传进来
  }
  _disconnectHandler = (event) => {
    //  断开
    this.close()
  }
  _errorHandler = () => {
    //  连接错误
    this.close()
  }
}
export default {
  install (Vue, options) { // 自己个挂的插件
    Vue.prototype.$ws = new Websocket(ws)
  }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值