Vue2/Vue3使用WebSocket 心跳检测(开箱即用,附带原理)

我司突然来了个大数据项目需要使用长连接 本来心想用定时器解决的但是后面业务涉及到一个操作最多同时只能一个人触发。这样的话定时器就无法满足需求的,就需要使用WebSocket。

1.首先创建WebSocket实例对象 这是JS原生自带的无需下载第三方库 如果需要心跳检测一定要封装成函数 调用 不需要就可以直接找个位置即可。

let connect =() =>{
// // 创建WebSocket对象并指定服务器地址 只需要IP加端口号 不需要加https或者http
var socket = new WebSocket('ws://192.168.1.90:9000/v1/ws/connect')
}
//调用
connect()

2.创建生命周期钩子监听各个阶段的事件

socket.onopen = function () {

  ws_heartCheck.start() // 启动心跳

  console.log('WebSocket连接已建立')

  // 在连接建立后,可以发送消息到服务器

}

// // 监听接收到服务器发送的消息

socket.onmessage = function (event:any) {

  console.log(event,'event')

  // socket.close() 主动断开连接方法

}

// // 监听连接关闭事件

socket.onclose = function (event) {

  console.log('WebSocket连接已关闭')

}

// // 监听连接错误事件

socket.onerror = function (event) {

  console.error('WebSocket连接错误:' + event)

}

3.设置心跳检测 主要的思路就是通过 定时器每隔一段时间主动向服务器推送状态码,服务器那边要是成功收到状态码,就会返回客户端成功的状态码,我们只需要根据相对于的状态码进行逻辑处理即可。如果返回失败的状态码我们需要主动断开连接调用socket.close()方法即可。然后在断开连接钩子设置定时器重新调用封装好的socket方法即可

// WebSocket心跳检测
var ws_heartCheck = {
  timeout: 5000, // 5秒一次心跳
  timeoutObj: null, // 执行心跳的定时器
  serverTimeoutObj: null, // 服务器超时定时器
  reset: function () {
    // 重置方法
    clearTimeout(this.timeoutObj)
    clearTimeout(this.serverTimeoutObj)
    return this
  },
  start: function () {
    // 启动方法
    var self = this
    this.timeoutObj = setTimeout(function () {
      // 这里发送一个心跳信息,后端收到后,返回一个消息,在onmessage拿到返回的心跳(信息)就说明连接正常
      socket.send(JSON.stringify({ "code": 1004 }))
      // 如果超过一定时间还没重置,说明后端主动断开了
      self.serverTimeoutObj = setTimeout(function () {
        // 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
        socket.close()
      }, self.timeout)
    }, this.timeout)
  }
}

4.使用心跳检测

// // 监听连接关闭事件
socket.onclose = function (event) {
  console.log('WebSocket连接已关闭')
  setTimeout(() => {
    connect() //心跳重连
  },1000)
}

 5.完整代码复制接口 开箱即用 

let connect =() =>{
// // 创建WebSocket对象并指定服务器地址 只需要IP加端口号 不需要加https或者http
var socket = new WebSocket('ws://192.168.1.90:9000/v1/ws/connect')
// // 监听连接建立事件
socket.onopen = function () {
  ws_heartCheck.start() // 启动心跳
  console.log('WebSocket连接已建立')
  // 在连接建立后,可以发送消息到服务器
}
// // 监听接收到服务器发送的消息
socket.onmessage = function (event:any) {
  console.log(event,'event')
  // socket.close() 主动断开连接方法
}
// // 监听连接关闭事件
socket.onclose = function (event) {
  console.log('WebSocket连接已关闭')
  setTimeout(() => {
    connect() //心跳重连
  },1000)
}
// // 监听连接错误事件
socket.onerror = function (event) {
  console.error('WebSocket连接错误:' + event)
}
// WebSocket心跳检测
var ws_heartCheck = {
  timeout: 5000, // 5秒一次心跳
  timeoutObj: null, // 执行心跳的定时器
  serverTimeoutObj: null, // 服务器超时定时器
  reset: function () {
    // 重置方法
    clearTimeout(this.timeoutObj)
    clearTimeout(this.serverTimeoutObj)
    return this
  },
  start: function () {
    // 启动方法
    var self = this
    this.timeoutObj = setTimeout(function () {
      // 这里发送一个心跳信息,后端收到后,返回一个消息,在onmessage拿到返回的心跳(信息)就说明连接正常
      socket.send(JSON.stringify({ "code": 1004 }))
      // 如果超过一定时间还没重置,说明后端主动断开了
      self.serverTimeoutObj = setTimeout(function () {
        // 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
        socket.close()
      }, self.timeout)
    }, this.timeout)
  }
}
}

connect()

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue中实现WebSocket心跳检测,可以通过在WebSocket连接上设置定时器来定期发送心跳包。以下是一个简单的示例: 1. 首先,安装WebSocket库。可以使用`npm`或`yarn`安装`vue-native-websocket`库: ``` npm install vue-native-websocket ``` 2. 在Vue应用程序的入口文件(如`main.js`)中导入WebSocket库并配置: ```javascript import VueNativeSock from 'vue-native-websocket'; Vue.use(VueNativeSock, 'ws://localhost:8080', { format: 'json', reconnection: true, // 是否重新连接 reconnectionAttempts: 5, // 重新连接尝试次数 reconnectionDelay: 3000, // 重新连接延迟时间(毫秒) store: store, // 可选,Vuex store实例 }); ``` 3. 在Vue组件中使用WebSocket并设置心跳检测: ```javascript export default { created() { // 设置心跳定时器 this.pingTimer = null; // 监听WebSocket连接成功事件 this.$options.sockets.onopen = () => { console.log('WebSocket连接成功'); // 开始心跳检测 this.startHeartbeat(); }; // 监听WebSocket接收消息事件 this.$options.sockets.onmessage = (event) => { console.log('接收到消息', event.data); // 处理接收到的消息 // ... }; }, methods: { // 启动心跳检测 startHeartbeat() { this.pingTimer = setInterval(() => { // 发送心跳包 this.$options.sockets.send(JSON.stringify({ type: 'ping' })); }, 5000); // 设置心跳间隔时间(毫秒) }, stopHeartbeat() { // 停止心跳检测 clearInterval(this.pingTimer); }, }, beforeDestroy() { // 在组件销毁前停止心跳检测 this.stopHeartbeat(); }, }; ``` 以上代码在Vue组件中创建了WebSocket连接,并在连接成功后设置了心跳检测定时器。每隔一定时间(例如5秒)发送一个心跳包到服务器。你可以根据实际需求调整心跳间隔时间。 注意:上述示例使用的是`vue-native-websocket`库,你也可以使用其他WebSocket库进行类似的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值