Vue websocket封装实现方法详解

 

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封装内容请搜索编程宝库以前的文章,希望以后支持编程宝库

ES6 开始,js 新增了剩余参数语法、展开语法等,它们有个共同之处就是都以 ... 这么个符号为前缀,好像很多地方都可以用到,但实际上又不是同一回事,容易让初学者晕头转向。本篇就对目前笔者已知的 ...