Vue websocket封装实现方法详解

 更新时间:2022年09月29日 09:57:09   作者:37 degrees Celsius  
项目中需要使用websocke,这个是我自己修修改改好多次之后用得最顺手的一版,分享一下。这个封装需要搭配vuex使用,因为收到的数据都保存在vuex中了,真的绝绝子好用,解决了我一大堆问题

1.封装的ws.js文件

let global_callback = null
let socket = '' // 存储 WebSocket 连接.
let timeoutObj = null  // 心跳定时器
let serverTimoutObj = null // 服务超时定时关闭
let lockReconnect = false // 是否真正建立了连接
let timeoutnum = null // 重新连接的定时器,  没连接上会一直重连,设置延迟避免请求过多
const socketConfig = {
  url: '',
  retryTimeout: 20000 // 心跳时间 暂定20s
}
export const sendWebsocket = function (agentData, callback) {
  global_callback = callback
  socketOnSend(agentData)
}
export const initWebSocket = function (url) {
  let weburl = url || socketConfig.url
  if (window.WebSocket) { return }
  if (!socket) {
    socket = new WebSocket(weburl)
    socketOnOpen()
    socketOnClose()
    socketOnError()
    socketOnMessage()
  }
}
/**
 * 关闭websocket函数
 */
export const closeWebsocket = function () {
  if (socket) {
    socket.close()
  }
  clearTimeout(timeoutObj)
  clearTimeout(serverTimoutObj)
}
function socketOnSend(data) {
  socket.send(data)
}
function socketOnOpen() {
  socket.onopen = () => {
    console.log('socket连接成功')
    start()
  }
}
// 开启心跳
function start() {
  timeoutObj && clearTimeout(timeoutObj)
  serverTimoutObj && clearTimeout(serverTimoutObj)
  timeoutObj = setTimeout(() => {
    // 这里发送一个心跳,后端收到后返回一个心跳消息
    if (socket.readyState === 1) {
      // 如果连接正常  给后端发送指定消息
      socket.send('')
      console.log('发送消息')
    } else {
      // 重连
      reconnect()
    }
    serverTimoutObj = setTimeout(() => {
      // 超时关闭连接
      socket.close()
    }, socketConfig.retryTimeout);
  }, socketConfig.retryTimeout);
}
// 重连
function reconnect() {
  if (lockReconnect) {
    return
  }
  lockReconnect = true
  timeoutnum && clearTimeout(timeoutnum)
  timeoutnum = setTimeout(() => {
    initWebSocket()
    lockReconnect = false
  }, 5000);
}
function socketOnClose() {
  socket.onclose = () => {
    console.log('socket已经关闭')
  }
}
function socketOnError() {
  socket.onerror = () => {
    reconnect()
    console.log('socket 连接失败')
  }
}
function socketOnMessage() {
  socket.onmessage = (e) => {
    global_callback(e.data)
    reset()
  }
}
// 重置心跳
function reset() {
  // 清除时间
  clearTimeout(timeoutObj)
  clearTimeout(serverTimoutObj)
  // 重启心跳
  start()
}

这里的封装export了三个方法

  • initWebSocket 用来初始化websock,可传入url
  • sendWebsocket 用来发送数据
  • closeWebsocket 用来关闭连接

2.使用方法

文件存放路径: /src/utils/ws.js

所需文件中按需引入

 1.首先需要再项目中进行初始化,如果你的项目有登陆的话,则你可以再home.vue里面进行引入:
 ```vue
 import { initWebSocket } from ‘@/utils/ws.js’
 ···
 eport default {
      created () {
         initWebSocket ()
     } 
 }
 ```

 2. 然后在你需要获取实时数据的地方进行引入并调用 sendWebsocket 
 ```vue
 import { sendWebsocket } from ‘@/utils/ws.js’
 ···
 eport default {
      created () {
         sendWebsocket (this.onWebSocketMessage)
     },
     methods: {
         onWebSocketMessage(data) {}
     }
 }
 ```

关闭websock

 import { closeSock} from "@/api/socket";
 export default {
 	destoryed () {
 		closeSock()
 	}
 }

到此这篇关于Vue websocket封装实现方法详解的文章就介绍到这了,更多相关Vue websocket封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue 组件注册实例详解

    Vue 组件注册实例详解

    这篇文章主要介绍了Vue 组件注册,结合实例形式较为详细的分析了vue.js组件的常见分类、注册方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02
  • vue实现输入框自动跳转功能

    vue实现输入框自动跳转功能

    这篇文章主要为大家详细介绍了vue实现输入框自动跳转功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 让 babel webpack vue 配置文件支持智能提示的方法

    让 babel webpack vue 配置文件支持智能提示的方法

    这篇文章主要介绍了让 babel webpack vue 配置文件支持智能提示的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Vue获取HTMLCollection列表的children时结果为undefined问题

    Vue获取HTMLCollection列表的children时结果为undefined问题

    这篇文章主要介绍了Vue获取HTMLCollection列表的children时结果为undefined问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 关于SpringBoot与Vue交互跨域问题解决方案

    关于SpringBoot与Vue交互跨域问题解决方案

    最近在利用springboot+vue整合开发一个前后端分离的个人博客网站,所以这一篇总结一下在开发中遇到的一个问题,关于解决在使用vue和springboot在开发前后端分离的项目时,如何解决跨域问题。在这里分别分享两种方法,分别在前端vue中解决和在后台springboot中解决。
    2021-10-10
  • vue+highCharts实现可选范围的图表

    vue+highCharts实现可选范围的图表

    这篇文章主要为大家详细介绍了vue+highCharts实现可选范围的图表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • elementUI实现下拉选项加多选框的示例代码

    elementUI实现下拉选项加多选框的示例代码

    因产品需求和UI样式调整,本文主要实现elementUI下拉选项加多选框的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Vue.js实现可编辑的表格

    Vue.js实现可编辑的表格

    这篇文章主要为大家详细介绍了Vue.js实现可编辑的表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • vue项目如何分环境部署

    vue项目如何分环境部署

    这篇文章主要介绍了vue项目如何分环境部署问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2018-12-12
  • Element-plus侧边栏踩坑的问题解决

    Element-plus侧边栏踩坑的问题解决

    本文主要介绍了Element-plus侧边栏踩坑的问题解决,主要解决了el-menu直接嵌套el-menu-item菜单,折叠时不会出现文字显示和小箭头无法隐藏的问题,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08

最新评论