前端实现实时数据更新:EventSource

news2024/11/17 15:41:31

前言

大看板相信很多人都做过,通常就是用来展示数据的。最初一些同事(包括我自己)都是通过定时器来实现的,每隔多长时间发送一次请求。后来用户说页面不刷新或者是页面卡死了,讨论的解决方案是改成WebSocket实时推送消息。最近看到一篇文章是介绍EventSource的,EventSourceWebSocket更适合用来更新数据

通过询问gpt,定时器、WebSocket还是EventSource哪一个用来实时更新数据后更加让我想要了解一下EventSource

在这里插入图片描述
关于WebSocketEventSource的介绍,大家可以看官方文档:

Web API接口:EventSource

Web API接口:WebSocket

简单示例

服务器端
这一部分使用node写的,a.js

const http = require("http");

http
  .createServer((req, res) => {
    // 处理跨域
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    res.setHeader("Access-Control-Allow-Headers", "Content-Type");
    // 设置请求头
    res.writeHead(200, {
      "Content-Type": "text/event-stream;charset=utf-8;",
      "Cache-Control": "no-cache",
      Connection: "keep-alive",
    });

    console.log("服务已启动:http://localhost:3000/");

    let counter = Math.floor(Math.random() * 10) + 1;

    const sendPing = () => {
      const curDate = new Date().toLocaleString();
      res.write(`event: ping\ndata: {"time": "${curDate}"}\n\n`);
    };

    const sendMessage = () => {
      const curDate = new Date().toLocaleString();
      res.write(`data: 这是一条消息,在${curDate}\n\n`);
      counter = Math.floor(Math.random() * 10) + 1;
    };

    const intervalId = setInterval(() => {
      sendPing();
      counter--;

      if (counter === 0) {
        sendMessage();
      }
    }, 1000);

    req.on("close", () => {
      clearInterval(intervalId);
      res.end();
    });
  })
  .listen(3000);

启动方式也很简单,在该文件所在的文件夹下打开终端,输入node node .\a.js,服务就启动了

前端
b.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Server-sent events demo</title>
  </head>
  <body>
    <button>关闭连接</button>

    <ul></ul>

    <script>
      const button = document.querySelector("button");
      // 设置连接地址
      const evtSource = new EventSource("http://localhost:3000/");
      // 一个布尔值,表示 EventSource 对象是否使用跨源资源共享(CORS)凭据来实例化(true),或者不使用(false,即默认值)。
      console.log("withCredentials:", evtSource.withCredentials);
      //一个代表连接状态的数字。可能值是 CONNECTING(0)、OPEN(1)或 CLOSED(2)。
      console.log("readyState:", evtSource.readyState);
      //   一个表示事件源的 URL 字符串。
      console.log("url:", evtSource.url);
      const eventList = document.querySelector("ul");

      evtSource.onopen = function () {
        console.log("服务连接成功.");
      };

      // 接受消息
      evtSource.onmessage = function (e) {
        const newElement = document.createElement("li");

        newElement.textContent = "message: " + e.data;
        eventList.appendChild(newElement);
      };

      // 错误处理
      evtSource.onerror = function () {
        console.log("EventSource failed.");
      };

      button.onclick = function () {
        console.log("连接已关闭");
        evtSource.close();
      };

      // 监听某一个具体的事件发送的消息
      evtSource.addEventListener(
        "ping",
        function (e) {
          var newElement = document.createElement("li");

          var obj = JSON.parse(e.data);
          newElement.innerHTML = "ping at " + obj.time;
          eventList.appendChild(newElement);
        },
        false
      );
    </script>
  </body>
</html>

效果
在这里插入图片描述

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

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

相关文章

AI绘图软件分享:Midjourney 基础教程(四)参数进阶

大家好&#xff0c;我是权知星球&#xff0c;今天我们继续来学习Midjourney 基础教程&#xff08;四&#xff09;&#xff1a;Midjourney 参数进阶。 通过前⼏篇⽂章的学习&#xff0c;我们知道了&#xff0c;想要掌握 Midjourney AI 绘画技术&#xff0c;先需要学习掌握常⽤的…

还在烦恼代码写不出来?低代码助力实现“无码”搭建系统平台

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 据说… 每敲出来一行代码 就有一根头发离我而去… 而每解决掉一个bug 就有一个毛囊开始休养生息… 程序猿&#xff0c;一个让人既爱又…

USR-C216配置客户端模式,手机接收数据

若是不清楚现在模块什么配置可先恢复出厂设置&#xff0c;将nReload拉低3S即可。 此时模块发出热点名字为USR-C216,无密码 电脑连接后在浏览器输入10.10.100.254&#xff0c;进入后密码和用户名为admin

多数人都不会用,有了这些视频APP,再也不担心失效!

阿虚储物间里一大热门下载内容就是影视类APP了 但相信有这类需求的粉丝都知道&#xff1a;这类APP要么你忍受烦人的广告&#xff0c;要么就找去广告版&#xff0c;但去广告版有个最大的问题就是经&#xff01;常&#xff01;失&#xff01;效&#xff01; 其实阿虚早就介绍过…

窗口层级树的构建

窗口层级树的构建 参考&#xff1a; android 13 WMS/AMS系统开发-窗口层级相关DisplayArea,WindowContainer第二节 在上一节dumpsys activity containers中&#xff0c;层级树中有如下的标识符&#xff1a; WindowedMagnificationHideDisplayCutoutOneHandedHideDisplayCut…

【软考网络管理员】2023年软考网管初级常见知识考点(4)-局域网基本概念

涉及知识点 局域网特点&#xff0c;局域网体系结构&#xff0c;局域网拓扑结构&#xff0c;局域网传输介质&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 文章目录 涉及知识点前言一、局域网的特点二、局域网体系…

Apache RocketMQ EventBridge:构建下一代事件驱动引擎

作者&#xff1a;沈林 前言 事件驱动&#xff0c;这个词在部分人印象中&#xff0c;它是一个过时的技术——没什么新意。从时间上看&#xff0c;确实也是这样&#xff0c;上世纪 60 年代&#xff0c;事件驱动就已经被正式提出&#xff0c;经常会被在 GUI 编程中。但是在有些人…

IO总线控制器模块在工业自动化中的关键应用

IO总线控制器模块是工业自动化系统中的关键组件&#xff0c;其功能和特点包括&#xff1a; IO集成&#xff1a;IO总线控制器模块通过支持多种IO接口和协议&#xff0c;实现了各种数字和模拟信号的集成和控制。它能够与各种传感器、执行器和其他设备进行通信和数据交换。 实时性…

TCP协议的滑动窗口具体是怎样控制流量的?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言TCP协议概述滑动窗…

小航助学2023年6月GESP_C++四级试卷(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题2.0分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在…

1分钟教你从0-1搭建Monorepo多包项目

1、monorepo是啥 在了解Monorepo之前&#xff0c;先说一下Multirepo Multirepo&#xff1a;指定的是不同项目由不同的仓库来存放管理 每个仓库都维护着各项目的npm包依赖 Monorepo指的是包含多个项目的单个仓库。 各个项目可以单独运行、打包、发布 Multirepo&#xff1a;分散式…

【CV】EfficientNet相比resnet有哪些优点,什么是深度可分离卷积

目录 前言使用深度可分离卷积普通卷积的计算参数量深度可分离卷积分为两个步骤&#xff1a;深度卷积和逐点卷积 使用多个缩放因子使用 Swish 激活函数 前言 高效的神经网络主要通过&#xff1a;1. 减少参数数量&#xff1b;2. 量化参数&#xff0c;减少每个参数占用内存 目前的…

Transformer中的Q,K,V

Query&#xff0c;Key&#xff0c;Value的概念取自于信息检索系统&#xff0c;举个简单的搜索的例子来说。当你在某电商平台搜索某件商品&#xff08;年轻女士冬季穿的红色薄款羽绒服&#xff09;时&#xff0c;你在搜索引擎上输入的内容便是Query&#xff0c;然后搜索引擎根据…

【历史上的今天】6 月 25 日:笔记本之父诞生;Windows 98 发布;通用产品代码首次商用

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 25 日&#xff0c;在 1951 年的这一天&#xff0c;世界上第一部彩色电视节目播出。电视经过了许多年的发展&#xff0c;人类的娱乐途径随着互联网的到来变…

SpringBoot 如何使用 Spring Test 进行集成测试

SpringBoot 如何使用 Spring Test 进行集成测试 简介 在开发过程中&#xff0c;单元测试是不可或缺的&#xff0c;它可以帮助我们及时发现代码的问题并进行修复&#xff0c;从而提高代码的质量和可维护性。但是&#xff0c;单元测试只能测试单个方法或类的功能&#xff0c;无…

HTTP | 深度解析HTTPS比HTTP 更安全的原因

目录 1. 不安全的 HTTP &#x1f333; 为什么 HTTP 协议不安全呢&#xff1f; 容易被窃听 容易被篡改 容易被伪造身份 &#x1f333; HTTPS 是如何解决以上安全性问题的呢&#xff1f; 数据加密 完整性摘要 数字证书 2. 加密算法 &#xff08;1&#xff09;对称加密…

Springboot宠物医院管理系统的设计与实现-计算机毕设 附源码84724

Springboot宠物医院管理系统的设计与实现 摘 要 现如今生活质量提高&#xff0c;人们追求精神健康&#xff0c;与家中宠物朝夕相处&#xff0c;感情深厚&#xff0c;宠物渐渐成了我们身边的朋友。因而宠物生病了&#xff0c;需要去看病&#xff0c;自古医院救死扶伤&#xff0c…

LabVIEW开发汽车发动机故障模拟器

LabVIEW开发汽车发动机故障模拟器 汽车发动机故障模拟器是一种电子培训系统&#xff0c;旨在指导初学者了解发动机的各种故障。有一些参数称为发动机故障&#xff0c;例如脏油、压缩不良、冷却液损失、润滑不良、散热器堵塞、火花爆震和火花塞磨损。任何系统在存在时都有一些缺…

分布式系统的事务处理:2PC与3PC的演化与挑战

在传统的单体应用中&#xff0c;事务管理相对较为简单&#xff0c;可以通过数据库事务来实现数据的一致性。然而&#xff0c;随着系统的拆分和分布式架构的应用&#xff0c;跨多个服务的事务操作变得更为复杂。这就引出了分布式事务的概念&#xff0c;它是保证分布式系统数据一…

io.netty学习(十二)Netty 工作原理

目录 前言 Netty 模型 代码示例 引入Maven依赖 服务端的管道处理器 服务端主程序 客户端管道处理器 客户端主程序 测试运行 总结 前言 上一篇文章我们对 Reactor 模型进行了详细的讲解&#xff0c;下面我们就来探究一下 Netty 模型&#xff0c;Netty 采用的就是 主从…