IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> vue中用webworker子线程连接websocket并实现数据自动更新 -> 正文阅读

[网络协议]vue中用webworker子线程连接websocket并实现数据自动更新

?

??第一步

先在store中声明好需要存储的数据。

 state: {
    testName: 'hello',
   
  },
mutations: {
    setTestName(state, name) {
      state.testName = name
    }
}

创建一个worker文件,连接websocket



let WS
let lockReconnect = false // 避免重复连接
const webWorkerSelf = self
const HeartBeat = {
  msgType: 'U',
  msgData: {
    ip: '127.0.0.1',
  },
  dataType: 'keepAlive',


}
//主线程
self.addEventListener(
  'message',
  function(e) {
    const data = e.data
    switch (data.cmd) {
      case 'sendOnline':
        heartCheck.sendOnline()
        break
      case 'config':
        Object.assign(HeartBeat.msgData)
        break
      case 'start':
        self.postMessage({
          type: 'webWorker',
          data: '启动webWorker'
        })
        createWebSocket()
        break
      case 'stop':
        WS.close()
        self.postMessage({
          type: 'webWorker',
          data: '停止webWorker'
        })
        // 服务器断开链接
        self.postMessage({
          type: 'keepalive',
          data: 'close' + new Date().toTimeString()
        })
        self.close() // 终止worker
        break
      default:
    }
  },
  false
)


const createWebSocket = function() {
  if (!WS) {
    WS = new WebSocket(url)
    WS.onerror = function(event) {
      reconnect(url)
    }
    WS.onclose = function(event) {
      reconnect(url)
    }
    WS.onopen = event => {
      // 服务器开启链接
      webWorkerSelf.postMessage({
        type: 'keepalive',
        data: 'start' + new Date().toTimeString()
      })
      heartCheck.reset().start() // 传递信息
    }
    WS.onmessage = e => {
      // 如果获取到消息,发送给主线程
      const data = JSON.parse(e.data)
      self.postMessage({
        type: 'webSocket',
        data
      })
      heartCheck.reset().start()
    }
  }
}
/***
 * 心跳检查
 * @type {{timeoutObj: null, start: heartCheck.start, reset: heartCheck.reset, timeout: number}}
 */
const heartCheck = {
  timeout: 30 * 1000, // 检查时间
  timeoutObj: null,
  serverTimeoutObj: null,
  reset: function() {
    clearTimeout(this.timeoutObj)
    clearTimeout(this.serverTimeoutObj)
    return this
  },
  // 发送在线信息
  sendOnline: function() {
    if (WS.readyState === 1) {
      WS.send(JSON.stringify(HeartBeat))
    }
  },
  close: function() {
    this.serverTimeoutObj = setTimeout(() => {
      // 如果超过一定时间还没重置,说明后端主动断开了
      // 服务器断开链接
      webWorkerSelf.postMessage({
        type: 'keepalive',
        data: 'close' + new Date().toTimeString()
      })
      WS.close() // 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
    }, this.timeout)
  },
  start: function() {
    this.timeoutObj = setTimeout(() => {
      // 这里发送一个心跳,返回一个心跳消息
      // onmessage拿到返回的心跳就说明连接正常
      this.sendOnline()
      this.close()
    }, this.timeout)
  }
}

/**
 * websocket重连
 */
function reconnect(url) {
  if (lockReconnect) return
  lockReconnect = true
  // 没连接上会一直重连,设置延迟避免请求过多
  setTimeout(function() {
    WS = null
    createWebSocket()
    lockReconnect = false
  }, 2000)
}

新建一个websocket文件将worker文件引入

<template>
  <div></div>
</template>

<script>
import Worker from './min.worker.js'



export default {
  name: 'socketView',
  data() {
    return {
      webSocket: null
    }
  },
  created() {
 
    this.initWebSocket()

  },

  methods: {
    initWebSocket() {
      const that = this
      // 用webworker子线程去连接webSocket
      this.webSocket = new Worker()
 
      this.webSocket.postMessage({ cmd: 'start' })
      this.webSocket.onmessage = function(event) {
        const { type, data } = event.data
        if (type === 'webSocket') {
             //这里调用store中的dispath或者commite储存数据
    
        } else if (type === 'keepalive') {
          //console.log('keepalive')
         
          if (data === 'close') {
            //
            //console.log('close')
          }
        }
      }
    },
    
  },
  beforeUnmount() {
    this.webSocket.postMessage({ cmd: 'stop' })
    setTimeout(() => {
      this.webSocket.terminate()
      this.webSocket = undefined
    })
  }
}
</script>

<style scoped></style>

再在页面中用computed监听数据,就能实现实时更新了!

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:36:12  更:2021-07-15 16:38:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 12:56:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码