vue websocket 建立连接并添加心跳检测机制

图片:
在这里插入图片描述
代码:
新建一个文件夹,里面有两个文件
在这里插入图片描述

组件1:
index.js

import Bus from './bus.js'

var websocketConnectdCount = 0

export function newWebsocket() {
  var websocket = null
  // 判断当前环境是否支持Websocket
  if (window.WebSocket) {
    if (!websocket) {
      const ws = 'ws://172.16.24.23:58080/webSocket'
      websocket = new WebSocket(ws)
    } else {
      console.log('not support websocket')
    }

    // 连接成功建立得回调方法
    websocket.onopen = function(e) {
      heartCheck.reset().start() // 成功建立连接后,重置心跳检测
      websocket.send('socket heart') // 连接成功将消息传给服务端
      console.log('connected successfully')
    }

    // 连接发生错误 会继续尝试发生新得连接 5次
    websocket.onerror = function() {
      console.log('onerror连接发生错误')
      websocketConnectdCount++
      if (websocketConnectdCount <= 5) {
        newWebsocket()
      }
    }

    // 连接到消息得回调方法
    websocket.onmessage = function(e) {
      console.log('接受到消息了', e)
      var message = e
      if (message) {
        Bus.$emit('message', message)
      }
      heartCheck.reset().start() // 如果获取到消息,说明连接是正常的,重置心跳检测
    }

    // 接受到服务端关闭连接时的回调方法
    websocket.onclose = function() {
      console.log('onclose断开连接')
    }

    // 监听窗口事件 窗口关闭 主动断开连接
    window.onbeforeunload = function() {
      websocket.close()
    }

    // 心跳检测, 每隔一段时间检测连接状态,如果处于连接中,
    // 就向server端主动发送消息,来重置server端与客户端的最大连接时间,如果已经断开了,发起重连。
    var heartCheck = {
      timeout: 300000, // 5分钟发一次心跳,比server端设置的连接时间稍微小一点,在接近断开的情况下以通信的方式去重置连接时间。
      timeoutObj: null,
      serverTimeoutObj: null,
      reset: function() {
        clearTimeout(this.timeoutObj)
        clearTimeout(this.serverTimeoutObj)
        return this
      },
      start: function() {
        this.serverTimeoutObj = setInterval(function() {
          if (websocket.readyState === 1) {
            console.log('连接状态,发送消息保持连接')
            websocket.send('socket heart') // 连接成功将消息传给服务端
            heartCheck.reset().start() // 如果获得消息 说明连接正常 重置心跳检测
          } else {
            console.log('断开连接, 尝试重连')
            newWebsocket()
          }
        }, this.timeout)
      }
    }
  }
}

组件2:
bus.js

import Vue from 'vue'
export default new Vue()

页面引入:

<script>
  import Bus from '@/socket/bus'
  import { newWebsocket } from '@/socket/index'
</script>
created () {
    newWebsocket()
    Bus.$on('message', res => {
      this.getSock(res)
    })
  },
methods: {
  getSock(msg) {
  	if (msg.data !== '服务器连接成功!') {
  	  let data = msg.data
  	  data = JSON.parse(data)
  	  console.log(data, 'socketData')  // data就是服务端发来的消息
  	}
  }
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝冰可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值