[Node.js] Server-Sent Events

news/2025/10/6 2:56:42/文章来源:https://www.cnblogs.com/Answer1215/p/19127224

远程通信方式

通信方式:

  1. Stdio: 推荐,高效、简洁、本地
  2. Streamable HTTP: 远程

前置知识

SSE 全称 Server-Sent Events,中文是“服务器发送事件”。是一种基于 HTTP 的单向通信协议,由浏览器发起连接,服务器可以持续不断地向客户端推送数据

你可以把它想象成:“浏览器打开一个通道,然后服务器不断地往里面发消息。”

SSE 特点

  1. 协议:基于 HTTP(长连接)
  2. 方向:单向:服务器 -> 客户端
  3. 格式:文本流,内容类型为 text/event-stream
  4. 浏览器支持:所有现代浏览器都支持(IE 除外)
  5. 应用场景:单方面需要推送的时候。实时通知、消息流、状态更新、股票/天气数据等

消息格式

SSE 协议规定,服务器以 text/event-stream 格式不断推送消息,每条消息格式如下:

event: 事件名   # 可选,默认是 message 事件
id: 唯一ID     # 可选
retry: 3000   # 客户端断线重连间隔,单位毫秒,可选
data: 内容     # 必需,可以多行

每条消息用空行 \n\n 作为结尾。

事件类型

如果服务器发送的数据中没有指定事件类型,浏览器端会将其作为默认事件类型 message 来处理:

data: 这是默认消息(data 代表要发送的消息)

客户端监听方式:

eventSource.addEventListener("message", (e) => {console.log("默认事件:", e.data);
});

可以自定义事件名:使用 event: 字段

event: update(事件名)
data: 新的更新内容

客户端监听方式:

eventSource.addEventListener("update", (e) => {console.log("收到 update 事件:", e.data);
});

课堂练习

SSE 服务器推送信息示例

import express from "express";
import { watch } from "chokidar";
import { join } from "path";
import { fileURLToPath } from "url";
import { dirname } from "path";const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);const app = express();const clients = new Set(); // 存储所有的客户端连接app.use(express.static(join(__dirname, "public")));app.get("/mcp", (req, res) => {res.setHeader("Content-Type", "text/event-stream");res.setHeader("Cache-Control", "no-cache");res.setHeader("Connection", "keep-alive");// 假设现在客户端连接过来,那么这里就给客户端推送一个消息res.write("event:connected\n"); // 事件名res.write("data:你已经连接上SSE服务器\n\n"); // 推送的数据clients.add(res);// 在客户端断开连接的时候,会触发 close 事件req.on("close", () => {clients.delete(res);});
});// 监听目录
const watcher = watch(join(__dirname, "watched"), {persistent: true,ignoreInitial: true,
});// 需要在目录发生变化的时候,通知所有的客户端
watcher.on("all", (event, path) => {// 将监听到的变化的信息,通知所有的客户端// 1. 组装要发送给客户端的信息const payload = JSON.stringify({event, // 当前资源发生变化 1. 新增 add  2. 删除 unlink  3. 修改 changepath, // 文件的路径time: new Date().toLocaleString(),});// 2. 通知所有的客户端for (const client of clients) {client.write(`event: resource_changed\n`);client.write(`data: ${payload}\n\n`);}console.log(`【发生了变更】${event} -> ${path}`);
});app.listen(3000, () => {console.log(`服务器已启动, 监听3000端口`);
});

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

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

相关文章

途途外贸企业网站管理系统asp网站后台产品管理中增加一个功能怎样修改

2024.6.13 **每日一题** 2813.子序列最大优雅度,本题利用了贪心的思想,首先将items按照profit从大到小进行排序,当子序列为前k个项目时,子序列的利润总和最大,但是总优雅度不一定最大,所以此时我们向后遍历…

温州有没有专门的企业网站网站开发需要什么关键技术

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数智化转型的浪潮中,数据管理领域正面临着前所未有的挑战和机遇。企业在数据管理过程中,普遍遭遇数据孤岛、数据质量不佳、存储和处理成本高昂、数据安全与隐私保护压力以及多源异构数据整合困难等诸多…

郴州做网站公司如何去掉wordpress底部版权

通过添加语言,你可以更改用于在 Windows、应用和 Web 中读取和写入的语言。添加语言若要更改你的 Windows 显示语言或者添加键盘以进行键入,首先要将一种语言添加到语言列表中。从屏幕右边缘向中间轻扫,点击“设置”,然后点击“更…

网站开发代码语言建站教程视频下载

背景 随着各大云厂商产品版图的扩大,基础计算设施,中间件服务,大数据/AI 服务,应用运维管理服务等都可以直接被企业和开发者拿来即用。我们注意到也有不少企业基于不同云厂商的服务作为基础来建设自己的企业基础设施中台。为了更…

打车网站开发阿里主机 wordpress

来源: AI科技评论一个跨学科的研究小组希望创建一个名为「机器行为」的新学科,以了解人工智能将如何对我们的社会、文化、经济与政治造成影响。在《自然》杂志的一篇评论文章中,作者认为人工智能算法的研究需要扩展到计算机科学以外的领域,纳…

别人做的网站怎么seo优化厦门建设局网站改到哪

Java 将PDF 转为图片 使用工具:Free Spire.PDF for Java(免费版) Jar文件获取及导入: 方法1:通过官网下载jar文件包。下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入Java程序。 方…

怎样搭建一个网站大型网站订单系统怎么设计

很多人总是这样认为:好好读书,考上好学校,将来可以找到一份不错的工作,这样的思想观念,可能会导致你一辈子都无法实现财富自由。 财富的多少,和你的努力程度没有直接关系。我们可以清楚看到那些每天辛苦劳动…

石家庄网站建设seo网站前期策划

在 Ubuntu 中添加新用户并给予 root 权限的步骤如下: 打开终端,以 root 身份登录。sudo su - 使用 adduser 命令添加新用户。 adduser username 为新用户设置密码 passwd username 将新用户添加到 sudo 组。 usermod -aG sudo username…

中国免费网站申请环球网最新国际新闻

大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing 原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各位…

网站建设 业务无忧建站

背景: gazebo 模型库里的模型在我需要完成的任务中不够用,还是得从 solidworks、3DMax, blender这种建模软件里面在手动画一些,或者去他们的库里面在挖一挖。 目录 1 blender 1-1 blender 相关links 1-2 install 2 gazebo导入模型 2-1 g…

厦门网站建设外贸装修估价网

城市内涝是多个城市广泛存在的问题,经常给城市的居民和基础设施带来一些安全威胁。暴雨引发的道路积水和交通中断、财产损失,甚至公共安全威胁都是城市管理者需要提前预防的问题。为了解决这些问题,内涝积水监测仪的应用是一大重要的举措&…

公司招聘网站排行榜中国电商平台排行榜前十

为什么不推荐使用外键与级联? 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 说明: 以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id&#xff0c…

广西旅游 网站建设青岛做网站排名

一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符: 大小写字母、数字、标点符号及一些其它符号元字符: 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…

python和php网站开发wordpress虚线框

云上磨一剑,砥砺自生辉移动云开发者社区挥手2020,焕新2021迎来社区功能全新升级现已正式上线移动云开发者社区自2020年11月对外发布以来,依托移动云全面的云能力、丰富的产品体系、专业领域能力培训认证、优质双创服务体系等核心资源&#xf…

网站建设报价方案下载建设网站的价格分析

题一:利用装饰器来计算函数的执行时间 代码: import timedef decorated(fn):def inner():a time.time() # func开始的时间 time.time记录时间fn()b time.time() # func结束的时间print(f"{fn.__name__}程序运行的总数时间:{b - a}秒"…

安顺市建设局网站宽屏网站设计

前言: 鸿蒙系统的学习与记录。 1 、使用开发工具:deveco-studio 1)这个是工具的安装 2)这个是工具包,里面包含了 obpm,如果你装不上这个,可以使用工具包内部的 2、安装 官方安装教程&#xff…

直播做网站WordPress多站点开启多语言

TypeScript 中的未知类型是一种特殊的类型,它用于表示我们不知道变量的类型是什么。与 any 类型不同,未知类型不允许我们直接对其进行操作或调用其方法,除非我们先进行类型检查。这是为了提高代码的类型安全性。 我们可以使用类型断言、类型…

四大门户网站是哪些单位网站建设目的

1.MyBatis的CRUD 创建工程&#xff1a; 1.1.查询 1.1.1.单个参数绑定 //单个参数传递public User findUserById(Integer id);<!--parameterType:指定输入参数的类型resultType&#xff1a;指定数据结果封装的数据类型#{id}&#xff1a;它代表占位符&#xff0c;相当于原来…

做网站属于技术开发吗WordPress多域名无法登录

微机原理 数据传送指令微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理指令 微机原理sub指令 csdn微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理 4指令系…