当前位置:   article > 正文

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

vue websocket心跳检测

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

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

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

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

  1. socket.onopen = function () {
  2.   ws_heartCheck.start() // 启动心跳
  3.   console.log('WebSocket连接已建立')
  4.   // 在连接建立后,可以发送消息到服务器
  5. }
  6. // // 监听接收到服务器发送的消息
  7. socket.onmessage = function (event:any) {
  8.   console.log(event,'event')
  9.   // socket.close() 主动断开连接方法
  10. }
  11. // // 监听连接关闭事件
  12. socket.onclose = function (event) {
  13.   console.log('WebSocket连接已关闭')
  14. }
  15. // // 监听连接错误事件
  16. socket.onerror = function (event) {
  17.   console.error('WebSocket连接错误:' + event)
  18. }

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

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

4.使用心跳检测

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

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

  1. let connect =() =>{
  2. // // 创建WebSocket对象并指定服务器地址 只需要IP加端口号 不需要加https或者http
  3. var socket = new WebSocket('ws://192.168.1.90:9000/v1/ws/connect')
  4. // // 监听连接建立事件
  5. socket.onopen = function () {
  6. ws_heartCheck.start() // 启动心跳
  7. console.log('WebSocket连接已建立')
  8. // 在连接建立后,可以发送消息到服务器
  9. }
  10. // // 监听接收到服务器发送的消息
  11. socket.onmessage = function (event:any) {
  12. console.log(event,'event')
  13. // socket.close() 主动断开连接方法
  14. }
  15. // // 监听连接关闭事件
  16. socket.onclose = function (event) {
  17. console.log('WebSocket连接已关闭')
  18. setTimeout(() => {
  19. connect() //心跳重连
  20. },1000)
  21. }
  22. // // 监听连接错误事件
  23. socket.onerror = function (event) {
  24. console.error('WebSocket连接错误:' + event)
  25. }
  26. // WebSocket心跳检测
  27. var ws_heartCheck = {
  28. timeout: 5000, // 5秒一次心跳
  29. timeoutObj: null, // 执行心跳的定时器
  30. serverTimeoutObj: null, // 服务器超时定时器
  31. reset: function () {
  32. // 重置方法
  33. clearTimeout(this.timeoutObj)
  34. clearTimeout(this.serverTimeoutObj)
  35. return this
  36. },
  37. start: function () {
  38. // 启动方法
  39. var self = this
  40. this.timeoutObj = setTimeout(function () {
  41. // 这里发送一个心跳信息,后端收到后,返回一个消息,在onmessage拿到返回的心跳(信息)就说明连接正常
  42. socket.send(JSON.stringify({ "code": 1004 }))
  43. // 如果超过一定时间还没重置,说明后端主动断开了
  44. self.serverTimeoutObj = setTimeout(function () {
  45. // 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
  46. socket.close()
  47. }, self.timeout)
  48. }, this.timeout)
  49. }
  50. }
  51. }
  52. connect()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/819963
推荐阅读
相关标签
  

闽ICP备14008679号