Vue中函数封装webSocket使用

802 阅读1分钟

1、新建socket_service.js

export default class SocketService {
  /**
   * 单例
   */
  static instance = null
  static get Instance() {
    if (!this.instance) {
      this.instance = new SocketService()
    }
    return this.instance
  }

  // 和服务端连接的socket对象
  ws = null

  // 存储回调函数
  callBackMapping = {}

  // 标识是否连接成功
  connected = false

  // 记录重试的次数
  sendRetryCount = 0

  // 重新连接尝试的次数
  connectRetryCount = 0

  //  定义连接服务器的方法
  connect() {
    // 连接服务器
    if (!window.WebSocket) {
      return console.log('您的浏览器不支持WebSocket')
    }
    this.ws = new WebSocket('ws://localhost:1234')
    // 连接成功的事件
    this.ws.onopen = () => {
      console.log('连接服务端成功')
      this.connected = true
      // 重置重新连接的次数
      this.connectRetryCount = 0
    }
    //   // 1.连接服务端失败
    //   // 2.当连接成功之后, 服务器关闭的情况(连接失败重连)
    this.ws.onclose = () => {
      console.log('连接服务端失败')
      this.connected = false
      this.connectRetryCount++
      setTimeout(() => {
        this.connect()
      }, 500 * this.connectRetryCount)
    }
    // 得到服务端发送过来的数据
    this.ws.onmessage = msg => {
      console.log('从服务端获取到了数据' + msg.data)
      // if (this.callBackMapping) {
        // this.callBackMapping.call(this, dataList)
      // }
    }
  }
  // 回调函数的注册
  registerCallBack (callBack) {
    console.log('回调函数的注册', callBack)
    this.callBackMapping = callBack
  }

  // 取消某一个回调函数
  unRegisterCallBack(callBack){
    console.log('取消某一个回调函数', callBack)
    this.callBackMapping = null
  }

  // 发送数据的方法
  send (data) {
    // 判断此时此刻有没有连接成功
    if (this.connected) {
      this.sendRetryCount = 0
      this.ws.send(data)
    } else {
      this.sendRetryCount++
      setTimeout(() => {
        this.send(data)
      }, this.sendRetryCount * 500)
    }
  }
}

2、在main.js中全局引入实例并挂载到原型

import SocketService from '@/server/socket_service'
// 对服务端进行websocket的连接
SocketService.Instance.connect()

Vue.prototype.$socket = SocketService.Instance

3、在vue组件中使用发送(客户端向服务端发送数据)

this.$socket.send(‘这是客户端发送的数据’)

4、在vue组件中使用接收(客户端接收服务端发送的数据)

1)注册回调函数
created(){
    // 注册回调函数
    this.$socket.registerCallBack(this.testData)
  }
2)取消回调函数
destroyed(){
    // 取消回调函数
    this.$socket.unRegisterCallBack(this.testData)
  }
3)接收到数据data
testData(data) {
      console.log('获取到传感器websocket数据', data)
}