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

使用SSE实现echarts数据实时更新

区别

SSE 和 WebSocket 原理和实现方式的区别

SSE( Server-Sent Events)

SSE 是基于传统的 HTTP 协议实现的,采用了长轮询(long-polling)机制。客户端通过向服务器发送一个 HTTP 请求,服务器保持连接打开并周期性地向客户端发送数据。

SSE 通过 EventSource 对象来实现,在客户端可以通过监听 onmessage 事件来接收服务器端发送的数据。

WebSocket

WebSocket 是基于独立的 TCP 连接实现的,使用自定义的协议。客户端和服务器之间可以建立持久的全双工通信的连接,可以双向发送和接收数据。

WebSocket 协议是基于帧的,可以通过发送不同类型的帧进行通信。

实现方法

前端(vue3)

建立连接

let eventSource: EventSource;
onMounted(() => {eventSource = new EventSource("http://localhost:3000/sse");eventSource.addEventListener("customEvent", (event) => {const data = JSON.parse(event.data);title.value = data;list.value = data.list;echartsInit();});eventSource.onopen = () => {title.value = "连接成功";};
});

断开连接

//关闭SSE
const closeSSE = () => {eventSource.close();title.value = "连接已关闭";
};

后端(nodejs)

router.get("/sse", async (req, res) => {let url = req.url;res.writeHead(200, {"Content-Type": "text/event-stream","Cache-Control": "no-cache",Connection: "keep-alive",});// 每隔 1 秒发送一条消息let id = 0;const intervalId = setInterval(async () => {let list = await userModel.find();// console.log(url);res.write(`event: customEvent\n`);res.write(`id: ${id}\n`);res.write(`retry: 30000\n`);// const params = url.split("?")[1]; 获取拼接内容const data = { id, time: new Date().toISOString(), list };res.write(`data: ${JSON.stringify(data)}\n\n`);id++;}, 1000);
});

实现效果

当我们修改数据的时候,图表也会实时更新

相关文章:

  • c++静态成员变量和静态成员函数
  • 腾讯云函数部署环境[使用函数URL]
  • 华为OD机考题(HJ50 四则运算)
  • WCCI 2024第三弹:忍者表演惊艳全场,盛大晚宴不容错过
  • 视频监控业务平台LntonCVS国标视频综合管理平台功能及技术优势
  • 暑期编程预习指南
  • CentOS 7镜像列表服务下线,还想继续使用该怎么办?
  • MySQL数据库增删改查示例
  • 量化交易心法——如何建立自己的算法交易事业
  • html+css+js淘宝商品界面
  • 析构函数和拷贝构造函数
  • 拼多多职位数据信息采集
  • 网格搜索(Grid Search)及其Python和MATLAB实现
  • 使用fabric8操作k8s
  • Firefox 编译指南2024 Windows10篇- 编译Firefox(三)
  • $translatePartialLoader加载失败及解决方式
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Angular 响应式表单之下拉框
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • docker-consul
  • es的写入过程
  • JavaScript函数式编程(一)
  • React中的“虫洞”——Context
  • Travix是如何部署应用程序到Kubernetes上的
  • 爱情 北京女病人
  • 程序员最讨厌的9句话,你可有补充?
  • 多线程事务回滚
  • 前端面试之闭包
  • 实现菜单下拉伸展折叠效果demo
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 手写双向链表LinkedList的几个常用功能
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • $NOIp2018$劝退记
  • (31)对象的克隆
  • (SpringBoot)第七章:SpringBoot日志文件
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)终结任务
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (算法)N皇后问题
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)原始图像数据和PDF中的图像数据
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例