当前位置: 首页 > article >正文

不一样的websocket封装简洁版

什么是websocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
可以实现后台向前台通信

初始化websocket的条件

登录了 但是没有websocket

    let ws = new WS()
    ws.create()

心跳机制

客户端每隔一段时间向服务端发送一个特有的心跳消息,每次服务端收到消息后只需将消息返回,此时,若二者还保持连接,则客户端会收到消息若没收到,则说明连接断开,此时客户端就要主动连接,完成一个周期

短线重连

若某时间段内客户端发送了消息,而服务端未返回,则认定为断线,这个时候会触发到websocket中的onclose事件,需要重新连接服务

心跳检测 重连核心代码

  1. 服务端每隔30s会向前台返回心跳检测的消息
  2. 而断开重连需要40s秒
  3. 若果一切正常 那么每隔30s就会清除timer定时器,也就不会走到前台主动关闭和重连的代码
  4. 但是如果超过了40s 服务端没有向前台发送心跳检测的消息 就会触发断开重连的逻辑
const token = sessionStorage.getItem("token")
class WS {
    constructor(config = {}) {
        this.url = config.url || "localhost"
        this.port = config.url || 4000
        this.protocol = config.protocol || 'ws'
        // 心跳检测
        this.time = config.time || 30 * 1000
        this.ws = null
    }
    create() {
        this.ws = new WebSocket(`${this.protocol}://${this.url}:${this.port}`)
        this.ws.onopen = this.onOpen
        this.ws.onmessage = this.onMessage
        this.ws.onclose = this.onClose
        this.ws.onerror = this.onError
    }
    onOpen = () => {
        /* 
            规定好发的必须是对象 对象里包含两个字段 type data
            websocket 是基于tcp 第一次连接靠的http 但是 不能修改header
        */
        this.ws.send(
            // 鉴权请求
            JSON.stringify({
                type: "auth",
                data: token
            })
        )
    }
    onMessage = (e) => {
        <!-- 接受消息 -->
        console.log(e.data)
        let { type, data } = JSON.parse(e.data)
        switch (type) {
            case "noAuth":
                console.log("没有权限")
                break;
            case "heartCheck":
                this.checkServer()
                this.ws.send(JSON.stringify({ type: "heartCheck" }))
                break;
            case "default":
                console.log("message")
        }
    }
    onClose = () => {
        <!-- 断开连接 -->
        this.ws.close()
    }
    onError = () => {
        <!-- 错误,在1s 后触发重连 -->
        setTimeout(() => {
            this.create()
        }, 1000)
    }
    checkServer = () => {
        // 40s还未收到心跳  重新创建websocket
        clearTimeout(this.timer) //进来就清楚了 timer定时器 30s后又清除了 而 timer要 40s才会执行 所以心跳正常是不会走的
        <!-- 当30s后心跳没有返回,就会触发下面的函数
            关闭连接
            走到报错 重连
         -->
        this.timer = setTimeout(() => {
            this.onClose()
            this.onError()
        }, this.time + 1000 * 10)//短线重连
    }
}
export default WS

http://www.kler.cn/news/10356.html

相关文章:

  • 设计模式之迭代器模式(C++)
  • 新品国产C2000,独立双核32位CPU,主频高达400MHz,QX320F280049
  • 数据分析-统计基础
  • 29岁,普通功能测试,我是如何在一周内拿到5份Offer的?
  • Linux 内存回收,思维导图记录
  • CMake项目使用ctest+gtest进行单元测试
  • Vulnhub:Digitalworld.local (Development)靶机
  • C++ 23 实用工具(二)绑定工具
  • 10.字符串
  • 学习机器人SLAM导航核心技术(一)
  • 网络之广播域和冲突域
  • Qt5.12实战之规则DLL导出函数使用
  • 什么是分布式锁
  • 软考第二章 数据通信基础
  • 写博客8年与人生第一个502万
  • 空间复杂度
  • Makefile第十课:Makefile编译
  • 当你觉得生活快熬不下去时,请你读一读《活着》
  • Elastic Enterprise Search 8.7:新连接器、网络爬虫提取规则和搜索分析客户端测试版
  • Golang数据类型比较
  • MongoDB
  • 使用 ArcGIS Pro 进行土地利用分类的机器学习和深度学习
  • SpringBoot常见的的面试点
  • ArrayList、LinkedList与Vector的区别?
  • 【自用】HTML笔记
  • VS Code 快捷键
  • 【C++11那些事儿(一)】
  • pandas读取Excel核心源码剖析,面向过程仿openpyxl源码实现Excel数据加载
  • 【RabbitMQ】
  • MATLAB算法实战应用案例精讲-【深度学习】多尺度特征融合(论文篇一)