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

vue实现websocket实时短消息通知

1、原理

websocket就是通过服务器向客户端推送消息,客户端也可以主动向服务器发送消息,是真正的双向平等对话,是一种长连接,只需要通过一次请求进行初始化。

2、事件

  • onopen: 客户端和服务器建立连接后触发,被称为客户端和服务器之间的初始握手。如果接收到open, 说明已经连接成功,可以进行通信了。
  • onmessage: 接收到消息时触发。服务器发送给客户端的消息可包括纯文本消息,二进制数据(Blob消息或者ArrayBuffer消息)。
  • onerror: 响应意外故障时触发,在错误之后总是会终止连接。
  • onclose:连接关闭时触发。一旦连接关闭后,客户端和服务端将不会再进行消息的收发。也可主动调用close()方法关闭连接

3、方法

  • send() : 在连接成功后关闭前,发送消息(onopen后和onclose前才可发送消息)
    • 参数:
      data: 要发送的数据,可以是字符串、二进制数据或者 Blob 对象。
  • close() : 关闭连接
    • 参数:
      code (可选): 一个数字,表示连接关闭的状态码。常见的状态码有 1000 表示正常关闭,1001 表示端点离开,等等。
      reason (可选): 一个字符串,表示连接关闭的原因。

4、实际应用

一般在登录后系统初始化的时候建立连接,使用vue的全局路由导航守卫可轻松实现

/**
 * 创建websocket连接
 * @param {{}} data 请求数据
 * @returns {Object}
 **/
export function connectSocket(data = {}) {
  // 连接错误error仅可重启3次
  let reloadTime = 3, timer;
  webSocketInit();

  function webSocketInit() {
    // 本次sess存储webSocket连结状态,在异常/关闭连结时,重新心跳起来
    window.sessionStorage.setItem('connSocket', '1')
    if (window.webSocket) window.webSocket.close();
    // 测试地址不可用替换为自己的地址ws或wss开头
    const ws = window.webSocket = new WebSocket('ws://124.222.224.186:8800');
    ws.onopen = () => {
      // window.sessionStorage.setItem('onopen', new Date().getTime());
      // 调用订阅消息的接口
      ws.send(JSON.stringify(data));
    };
    // 连接关闭
    ws.onclose = () => {
      // window.sessionStorage.setItem('onclose', new Date().getTime());
      window.sessionStorage.setItem('connSocket', '0')
      reconnect('close');
    };
    // 接收服务器推送消息
    ws.onmessage = (res) => {
      const messData = JSON.parse(res.data)
      ElNotification.info({
        title: '消息通知',
        message: messData.data ? JSON.parse(messData.data).message : ''
      });
    };
    // 连接发生错误时
    ws.onerror = () => {
      // window.sessionStorage.setItem('onerror', new Date().getTime());
      window.sessionStorage.setItem('connSocket', '0')
      reconnect('error');
    }
  }

  // 重连
  function reconnect(mode) {
    window.clearTimeout(timer);
    // 连接错误仅可重启3次
    if (mode === 'error' && reloadTime <= 0) return false;
    // connSocket为0时才可重启
    if (window.sessionStorage.getItem('connSocket') === '1') return false;
    timer = setTimeout(function () {
      reloadTime--;
      webSocketInit();
    }, 2000);
  }
}

http://www.kler.cn/a/383661.html

相关文章:

  • 删除 需要来自XXXX的权限才能对此文件夹进行更改 文件的解决办法
  • Ubuntu - 进入紧急模式,无法进入桌面
  • Axios-Mock-Adapter mock数据
  • 5.Java 数组(一维数组、二维数组、数组实例实操)
  • 一周内从0到1开发一款 AR眼镜 相机应用?
  • 论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution
  • 完全背包模板总结
  • 设计者模式之策略模式
  • 《构建一个具备从后端数据库获取数据并再前端显示的内容页面:前后端实现解析》
  • 集中管理用户名和密码,定期修改密码快捷方便
  • 参数跟丢了之JS生成器和包装器
  • PostgreSQL核心揭秘(三)-元组结构
  • 【科普】conda、virtualenv, venv分别是什么?它们之间有什么区别?
  • 讲讲RabbitMQ 性能优化
  • Qt中弹出窗口的实现与鼠标事件处理
  • ctfshow(91,96,97)--PHP特性
  • Spring Boot 中Nacos的用法及流程
  • lua入门教程 :模块和包
  • 【C++】vector 类深度解析:探索动态数组的奥秘
  • Hive面试题-- hive中查询用户连续三天登录记录的实现与解析
  • 【码农日常】Vscode Clangd初始化失败(Win10)
  • M1M2 MAC安装windows11 虚拟机的全过程
  • CSS中常见的两列布局、三列布局、百分比和多行多列布局!
  • 13.React useTimeout
  • 服务器虚拟化:现代IT基础设施的基石
  • 【660】基于SSM+Vue的在线学习系统设计与实现