WebSocket实现消息实时通知

news2024/12/25 12:14:47

参考文档:万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践、WebSocket 教程

1 背景

有一个需求,需要实现实时通信的功能,如果有新消息,后端会主动发送请求告知前端有新消息,需要前端展示该新消息。

目前HTTP协议的话,只能支持客户端向服务器发出请求,服务器返回查询结果,做不到服务器主动向客户端推送信息。

或者,前端考虑定时向服务端发送请求(轮询),来判断是否有新消息,但是这种方式不太灵敏,而且可能前端发送的无用请求会很多。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

所以考虑WebSocket,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

2 短轮询 & 长轮询

短轮询:服务器收到请求不管是否有数据都直接响应 http 请求。

长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

在这里插入图片描述

在这里插入图片描述

3 WebSocket概念

(1) Websocket 使用 ws 或 wss 的统一资源标志符(URI),其中 wss 表示使用了 TLS 的 Websocket。

如:

ws://echo.websocket.org
wss://echo.websocket.org

(2)创建链接的方式,WebSocket MDN

const websocket = new WebSocket(url[, protocols])

(3)常用事件

WebSocket.onclose:用于指定连接关闭后的回调函数。

WebSocket.onmessage:用于指定当从服务器接受到信息时的回调函数。

WebSocket.readyState:链接状态

  • 0 (WebSocket.CONNECTING):正在链接中

  • 1 (WebSocket.OPEN):已经链接并且可以通讯

  • 2 (WebSocket.CLOSING):连接正在关闭

  • 3 (WebSocket.CLOSED):连接已关闭或者没有链接成功

4 使用

useEffect(() => {
    // 1. 创建websockets对象,参数为服务器websockets地址
    const websockets = new WebSocket(`wss://${window.location.host}/ws/inner/message/start`);

    console.log('websockets:', websockets);

    // 2. 监听接收消息的情况
    websockets.onmessage = (res) => {
      console.log('onmessage:', res);

      // 信息处理
      const msg = JSON.parse(res?.data);
      const url = msg?.id ? `${basePath}/message-center?id=${msg?.id}` : `${basePath}/message-center`;
      notification.info({
        message: 'New Message',
        description: (
          <>
            {msg?.title} <a onClick={() => history.push(url)}>read more</a >
          </>
        ),
      });

      if (msg?.id) {
        // id存在的情况下,说明是新信息,当点击read more进入消息中心页面的时候,需要直接弹窗显示最新信息;否则表示刚进入页面时候的欢迎信息
        store.dispatch(setMessageData({ newMessageItem: msg }));
      }

      // 重新获取未读的信息数量
      runUnreadMessageList();
    };

    return () => {
      websockets.close();
    };
  }, []);

链接成功后,弹出消息提示:
在这里插入图片描述

websocket对象和onmessgae截图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1832056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最佳 PDF 合并工具评测

PDF是我们官方文档常用的格式。因此&#xff0c;如今处理 PDF 文件是一项非常重要的技能&#xff0c;例如使用 doc 创建 pdf、将 pdf 文件合并为单个 pdf、将 pdf 拆分为多个 pdf 文件、为 pdf 文件添加密码以进行安全分发等等。获得上述技能的关键部分是找到一个简单但功能强大…

YOLOv10项目-服务器上运行

1、前言 2、运行YOLOv10代码流程&#xff08;超详细&#xff09; &#xff08;3&#xff09;根据下面步骤安装&#xff1a; &#xff08;4&#xff09;数据集和其他配置 &#xff08;5&#xff09;测试训练&#xff08;很详细&#xff09; 1、前言 由于一些事情&#xff0…

0617_QT3

练习&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//去掉头部this->setWindowFlag(Qt::FramelessWindowHint);//去掉空白部分this->setA…

第二十篇——去除噪音:如何获得更多更准确的信息?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 噪音的原理&#xff0c;换一个维度来看就会很清晰了&#xff1b;通俗易懂…

【秋招突围】2024届秋招笔试-小红书笔试题-第三套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

vue2实现一个简易实用的日历(可特殊标记多个日期)

效果如下&#xff1a; <template><div class"calendar"><div class"header"><button click"previousMonth"><</button><h2>{{ currentYear }}-{{ currentMonth }} </h2><button click"nex…

【Kubernetes】k8s 自动伸缩机制—— HPA 部署

一、在K8s中扩缩容分为两种&#xff1a; ●Node层面&#xff1a;对K8s物理节点扩容和缩容&#xff0c;根据业务规模实现物理节点自动扩缩容 ●Pod层面&#xff1a;我们一般会使用Deployment中的Replicas参数&#xff0c;设置多个副本集来保证服务的高可用&#xff0c;但是这是…

vue3 使用 watch 时陷入了个直觉陷阱

场景&#xff1a;在vue中&#xff0c;使用watch 的场景是很常见的。编写业务代码时&#xff0c;需要监听一个或多个值的变化时&#xff0c;经常性会使用watch&#xff0c;日常使用就不提了&#xff0c;直入主题&#xff0c;来一段使用watch的简单代码&#xff0c;有一定前端水平…

火车头采集中英文翻译教程

火车头采集怎么实现数据中文翻译成英文&#xff0c;或英文翻译成中文&#xff1f; 火车头采集没有自带的翻译功能&#xff0c;但可以使用插件功能来实现&#xff1a;导入翻译插件&#xff08;例如谷歌翻译插件&#xff0c;百度翻译插件等&#xff09;&#xff0c;然后在火车头…

618狂欢日,美味产品齐上阵,超值优惠等你享

这个充满激情与活力的6月&#xff0c;我们带着满满的诚意与惊喜&#xff0c;为广大美食爱好者们开启一场独特的618狂欢之旅。 当我们提及甘肃&#xff0c;那丰富多样的甘肃传统美食便是不得不说的瑰宝。烤馍&#xff0c;油饼&#xff0c;锅盔、擀面皮、浆水等每一种美食都…

CSS入门基础2

目录 1.标签类型 2.块元素 3.行内元素 4.行内块元素 5.标签行内转换 6.背景样式 1.标签类型 标签以什么方式进行显示&#xff0c;比如div 自己占一行&#xff0c; 比如span 一行可以放很多个HTML标签一般分为块标签和行内标签两种类型&#xff1a; 块元素行内元素。 2.块…

多模态LLM 跨越语言与视觉的边界

一、引言 在数字时代的浪潮中&#xff0c;我们被由语言和视觉等多种模态构成的信息海洋所包围。人类大脑以其卓越的多模态上下文理解能力&#xff0c;在日常任务中游刃有余。然而&#xff0c;在人工智能领域&#xff0c;如何将这种能力赋予机器&#xff0c;尤其是如何在语言模…

浙江电信联合中兴通讯取得新突破,完成融合边缘商用验证

前不久&#xff0c;浙江电信联合中兴通讯在融合边缘方面取得新突破&#xff0c;在嘉兴完成了融合边缘的商用验证&#xff0c;并发布了商用版本。接下来&#xff0c;双方在融合边缘方面正式进入商用阶段&#xff0c;有效赋能新质生产力。    随着数字经济的快速发展&#xff0…

Linux时间子系统6:NTP原理和Linux NTP校时机制

一、前言 上篇介绍了时间同步的基本概念和常见的时间同步协议NTP、PTP&#xff0c;本篇将详细介绍NTP的原理以及NTP在Linux上如何实现校时。 二、NTP原理介绍 1. 什么是NTP 网络时间协议&#xff08;英语&#xff1a;Network Time Protocol&#xff0c;缩写&#xff1a;NTP&a…

windows系统把桌面的文件重定向到电脑的其他分区盘

当我们使用windows系统的电脑时&#xff0c;很喜欢把一些常用的文件放到桌面上。而桌面上的文件默认都是设定在C盘下的。时间长了&#xff0c;C盘容易爆红(空间不足)。下面我将介绍一种比较简单快捷的办法来解决这种问题--就是把桌面的文件重定向到电脑的其他分区盘。 首先我们…

学习笔记——网络管理与运维——SNMP(基本配置)

四、SNMP基本配置 1、SNMP配置举例 整个华为数通学习笔记系列中&#xff0c;本人是以网络视频与网络文章的方式自学的&#xff0c;并按自己理解的方式总结了学习笔记&#xff0c;某些笔记段落中可能有部分文字或图片与网络中有雷同&#xff0c;并非抄袭。完处于学习态度&#x…

FlowUs息流开启知识管理的新纪元|FlowUs息流公开知识库

在信息爆炸的时代&#xff0c;如何高效地管理和利用知识成为了一个挑战。FlowUs知识库以其超巨的性价比&#xff0c;为用户带来了全新的解决方案。它不仅仅是一个存储信息的工具&#xff0c;更是一个能够激发创造力和提高生产力的平台。 性价比之选 FlowUs以其合理的价格&…

大数据Kubernetes(K8S)命令指南 超级详细!

文章目录 大数据Kubernetes&#xff08;K8S&#xff09;命令指南 超级详细&#xff01;一、基础命令二、资源创建与管理三、集群管理与维护四、其他指令配置管理调试和诊断插件和扩展 大数据Kubernetes&#xff08;K8S&#xff09;命令指南 超级详细&#xff01; 一、基础命令 …

目标检测:IOU

IOU&#xff08;Intersection over Union&#xff09;交并比&#xff1a; 它计算的是“预测的边框”和“真实的边框”的交叠率&#xff0c;即它们的交集和并集的比值。这个比值用于衡量预测边框与真实边框的重叠程度&#xff0c;从而评估目标检测的准确性。 在目标检测任务中…

【总线】AXI总线:FPGA设计中的通信骨干

目录 AXI4&#xff1a;高性能地址映射通信的基石 AXI4-Lite&#xff1a;轻量级但功能强大的通信接口 AXI4-Stream&#xff1a;高速流数据传输的利器 结语&#xff1a;AXI总线在FPGA设计中的重要性 大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计…