关于 SSE(Server-Sent Events)过程的简要解剖

Js前端:发送普通请求

fetch(...)
.then(()=>{})
.catch(()=>{})

Java后端:接收请求后调用请求处理函数,函数返回一个emiiter对象

public SseEmitter handleRequest(...) {// 创建一个 SseEmitter 对象,用于发送 SSE 事件SseEmitter emitter = new SseEmitter();...return emiiter;  // 将 SseEmitter 对象返回给前端,以便前端可以订阅 SSE 事件 (即:与前端建立 SSE 连接)
}

Js前端:创建一个 EventSource 对象,指定一个 GET 请求的 URL 来接收 SSE 事件

// 构建请求URL
const url = `/api/test`;// 创建一个新的 EventSource 对象,用于接受 SSE 事件
const eventSource = new EventSource(url);

Js前端:通过 EventSource 对象监听 onmessage 事件

// 当接收到新的 SSE 事件时,触发 onmessage 事件处理程序,然后在里面可以解析接收到的 JSON 数据// 监听 SSE 消息eventSource.onmessage = function (event) {try {// 解析 JSON 格式的消息const data = JSON.parse(event.data);// 根据数据处理逻辑...}} catch (e) {console.log(e);}};

Js前端:通过 EventSource 对象监听 onerror 事件

// 当发生错误时(例如网络问题或服务器关闭连接),触发 onerror 事件处理程序// 监听 SSE 错误事件eventSource.onerror = function (error) {console.log(error);eventSource.close(); // 关闭 EventSource 连接};

Java后端:发送SSE事件,将数据推送到前端(可以发送后再发送,发了再发,不用关闭连接)

// 发送 SSE 事件,将获取结果发送给前端
const message = "Hello World"
emitter.send(SseEmitter.event().data(message));

Java后端:如果不需要发送了,就关闭连接

// 调用下面方法,会发送一个特殊的 end-of-stream 字节序列通知客户端连接已关闭
emitter.complete()

Java后端:如果在处理过程中发生异常,后端可以调用 emitter.completeWithError() 方法,这会发送一个错误事件给前端,并关闭连接

emitter.completeWithError(new Exception('出错了'))

Js前端:浏览器在接收到 emitter.complete() 发送的特殊字节序列后,会自动将 EventSourcereadyState 设置为 CLOSED(值为 2),并关闭连接。

Js前端:当 EventSource 对象检测到错误时(例如网络问题、服务器关闭连接等),会触发 onerror 事件,我们可以在里面输入日志并关闭连接。通过这种方式,让前端可以有效地管理和维护 SSE 连接,确保在各种情况下都能正确处理错误并关闭连接。

// 监听 SSE 错误事件eventSource.onerror = function (error) {console.log(error);eventSource.close(); // 关闭 EventSource 连接};

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

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

相关文章

PyTorch 中unsqueeze(-1)用法

unsqueeze(-1) 是 PyTorch 中的一个张量操作,用于‌在指定维度上增加一个长度为1的维度‌(即扩展维度)。具体解析如下: 功能说明 ‌作用位置‌ -1 表示在张量的‌最后一个维度‌后添加新维度。 (等价于 dimlen(tensor.…

RTC技术

什么是RTC RTC(Real time communication)实时通信,是实时音视频的一个简称,我们常说的RTC技术一般指的是WebRTC技术,已经被 W3C 和 IETF 发布为正式标准。由于几乎所有主流浏览器都支持 WebRTC 标准 API ,…

vue+cesium示例:3Dtiles三维模型高度调整(附源码下载)

接到一位知识星友的邀请,实现他需要3Dtiles三维模型的简单高度调整需求,适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境:依赖Node安装环境,demo本地Node版本:推荐v18。 运行工具:…

详解3DGS

4 可微分的3D高斯 splatting 核心目标与表示选择 我们的目标是从无法线的稀疏SfM点出发,优化出一种能够实现高质量新视角合成的场景表示。为此,我们选择3D高斯作为基本图元,它兼具可微分的体表示特性和非结构化的显式表示优势,既…

构建版本没mac上传APP方法

在苹果开发者的app store connect上架Ios应用的时候,发现需要使用xode等软件来上传iOS的APP。 但是不管是xcode也好,transporter也好,还是命令行工具也好,都必须安装在mac电脑才能使用,。 假如没有mac电脑&#xff0…

Gitee PPM:智能化项目管理如何重塑软件工厂的未来格局

在数字化转型浪潮席卷全球的当下,软件开发行业正经历着前所未有的变革。随着企业项目复杂度呈指数级增长,传统项目管理方式已难以应对多项目并行、跨团队协作等挑战。Gitee项目组合管理(PPM)作为新一代智能化项目管理解决方案&…

node入门:安装和npm使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装npm命令nvm 前言 因为学习vue接触的,一直以为node是和vue绑定的,还以为vue跑起来必须要node,后续发现并不是。 看…

单例模式,饿汉式,懒汉式,在java和spring中的体现

目录 饿汉式单例模式 懒汉式单例模式 Spring中的单例模式 关键差异对比 在Java和Spring中的应用场景 手写案例 单例模式是一种创建型设计模式,其核心在于确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。下面将详细介绍饿汉式和懒汉式…

网络编程——UDP网络编程

文章目录 1、sendto(),recvfrom() 与TCP编程不同的是: 无需建立连接,在recvfrom()阻塞等待客户端的数据,收到数据后进入do something进行数据的处理。 1、sendto(),recvfrom() ssize_t sendto(int socket, void *mes…

OpenSSL详解

这里写目录标题 选项:**通用选项:**1. genrsa:生成RSA密钥对3. req:生成证书签名请求4. x509:生成自签名证书 **证书管理:**1. verify:验证证书2. x509:查看证书详情3. crl&#xff…

MySQL的日志和备份

目录 一. MySQL的日志 1.1 日志的作用 1.2 日志的分类 1.3 事务日志 1.4 错误日志 1.5 通用日志 1.6 慢查询日志 1.7 二进制备份 二. 备份 2.1 数据备份的重要性 2.2 备份的分类 2.3 MySQL备份的内容 2.4 备份的注意点 2.5 备份的工具 2.6 实战案例 2.7 mysql…

前端性能优化:如何让网页加载更快?

摘要 想象一下,满心期待点开一个网页,却等了十几秒还卡在加载界面,你是不是瞬间就想关掉走人?这可不是个别用户的 “急性子”,数据显示,网页每多延迟 1 秒,用户流失率可能增加 11%!…

[论文阅读]Prompt Injection attack against LLM-integrated Applications

Prompt Injection attack against LLM-integrated Applications [2306.05499] Prompt Injection attack against LLM-integrated Applications 传统提示注入攻击效果差,主要原因在于: 不同的应用对待用户的输入内容不同,有的将其视为问题&a…

微信小程序进阶第2篇__事件类型_冒泡_非冒泡

在小程序中, 事件分为两种类型: 冒泡事件, 当一个组件上的事件被触发后,该事件会向父节点传递非冒泡事件, 当一个组件上的事件被触发后, 该事件不会向父节点传递。 一 冒泡事件 tap, touchst…

[免费]SpringBoot+Vue在线教育(在线学习)系统(高级版)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue在线教育(在线学习)系统(高级版)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】SpringBootVue在线教育(在线学习)系统(高级版) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

TypeScript 针对 iOS 不支持 JIT 的优化策略总结

# **TypeScript 针对 iOS 不支持 JIT 的优化策略总结** 由于 iOS 的 **JavaScriptCore (JSC)** 引擎 **禁用 JIT(Just-In-Time 编译)**,JavaScript 在 iOS 上的执行性能较差,尤其是涉及动态代码时。 **TypeScript(T…

项目部署一次记录

链路:(用户)客户端 → Nginx:192.168.138.100→ Tomcat (程序):192.168.138.101→ MySQL/Redis 打开数据库:systemctl start mysqld 重启网络: systemctl restart NetworkManager 关闭防火墙&am…

C 语言学习笔记

文章目录 程序设计入门 --- C 语言第一周 程序设计与 C 语言1 计算机与编程语言:计算机怎么做事情的,编程语言是什么📒 1.1 计算机的普遍应用 —— 离了它,现代人可能不会“活”了**🌐 科学计算:计算机的“…

服务器修改/home的挂载路径

写在前面:前段时间新装了一台服务器,/home目录原本是挂在在系统盘/dev/sda4的分区下,但是系统盘的空间比较小,为了保证后续使用起来,不会遇到磁盘很快就占满的情况,现在需要将 /home 独立出来,挂…

刷机维修进阶教程-----没有开启usb调试 如何在锁定机型的拨号界面特殊手段来开启ADB

有时候我们会遇到一些机型被屏幕锁 账号锁等锁定。无法进入系统界面。也没有开启usb调试的情况下如何通过一些操作来开启adb调试。然后通过adb指令来禁用对应的app顺利进入系统。以此来操作保数据等操作. 通过博文了解💝💝💝 1💝💝💝----了解一些品牌机型锁定状态…