SpringBoot整合SSE技术详解

Hi 👋, I'm shy

SHY QR Code

SpringBoot整合SSE技术详解

1. 引言

在现代Web应用中,实时通信变得越来越重要。Server-Sent Events (SSE)是一种允许服务器向客户端推送数据的技术,为实现实时更新提供了一种简单而有效的方法。本文将详细介绍如何在SpringBoot中整合SSE,并探讨SSE与WebSocket的区别。

2. SSE简介

Server-Sent Events (SSE)是一种基于HTTP的服务器推送技术。它允许服务器通过HTTP连接向客户端发送事件流。SSE非常适合于单向数据传输的场景,例如实时通知、股票行情更新等。

2.1 SSE的主要特点

  • 基于HTTP协议,无需特殊协议
  • 单向通信(服务器到客户端)
  • 自动重连机制
  • 支持自定义事件
  • 轻量级,易于实现

3. SpringBoot整合SSE

3.1 添加依赖

首先,确保你的SpringBoot项目中包含了Web依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.2 创建SSE控制器

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;@CrossOrigin
@RestController
@RequestMapping("sse")
public class SseController {private final ExecutorService executorService = Executors.newCachedThreadPool();@GetMapping("/handleSse")public SseEmitter handleSse() {SseEmitter emitter = new SseEmitter();executorService.execute(() -> {try {for (int i = 0; i < 10; i++) {emitter.send(SseEmitter.event().name("message").data("SSE Event #" + i));Thread.sleep(1000);}emitter.complete();} catch (IOException | InterruptedException e) {emitter.completeWithError(e);}});return emitter;}
}

这个控制器创建了一个SSE端点(/handleSse),它会发送10个事件,每个事件间隔1秒。

3.3 客户端实现

在前端,你可以使用JavaScript的EventSource API来接收SSE事件:

<!DOCTYPE html>
<html>
<body>
<h1>SSE Demo</h1>
<div id="messages"></div><script>const eventSource = new EventSource('http://localhost:8001/sse/handleSse');const messages = document.getElementById('messages');eventSource.onmessage = function(event) {const message = document.createElement('p');message.textContent = event.data;messages.appendChild(message);};eventSource.onerror = function(error) {console.error('EventSource failed:', error);eventSource.close();};
</script>
</body>
</html>

3.4 测试结果

在这里插入图片描述

3.5 浏览器请求

在这里插入图片描述

4. SSE与WebSocket的比较

虽然SSE和WebSocket都用于实时通信,但它们有一些关键区别:

4.1 通信方向

  • SSE: 单向通信(服务器到客户端)
  • WebSocket: 全双工通信(双向)

4.2 协议

  • SSE: 基于HTTP
  • WebSocket: 使用自己的协议(ws://或wss://)

4.3 复杂性

  • SSE: 相对简单,易于实现
  • WebSocket: 较复杂,需要处理更多的连接状态

4.4 浏览器支持

  • SSE: 大多数现代浏览器支持
  • WebSocket: 几乎所有现代浏览器支持

4.5 重连机制

  • SSE: 内置自动重连
  • WebSocket: 需要手动实现重连

4.6 适用场景

  • SSE: 适合单向数据流,如通知系统
  • WebSocket: 适合需要频繁双向通信的场景,如聊天应用

5. SSE的优势

  1. 简单性: 相比WebSocket,SSE的实现和维护更加简单。
  2. 基于HTTP: 不需要特殊的协议或服务器配置。
  3. 防火墙友好: 由于使用标准HTTP,不会被防火墙阻挡。
  4. 自动重连: 内置的重连机制提高了可靠性。

6. SSE的限制

  1. 单向通信: 不适合需要客户端频繁发送数据的场景。
  2. 连接数限制: 浏览器对同一域名的SSE连接数有限制。
  3. 数据大小: 某些代理服务器可能会缓冲响应,影响实时性。

7. 结论

SpringBoot整合SSE提供了一种简单而强大的方式来实现服务器推送功能。虽然SSE不如WebSocket全能,但在很多单向实时通信的场景中,SSE是一个更简单、更轻量级的选择。在选择使用SSE还是WebSocket时,需要根据具体的应用需求来决定。

SSE的简单性和与HTTP的兼容性使其成为许多实时应用的理想选择,特别是那些主要需要服务器向客户端推送数据的应用。通过本文的介绍和示例,你应该能够在SpringBoot项目中轻松地实现SSE,并理解何时选择SSE而非WebSocket。

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

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

相关文章

Java的四种引用类型

Java的四种引用类型 1. 强引用&#xff08;Strong Reference&#xff09;2. 软引用&#xff08;Soft Reference&#xff09;3. 弱引用&#xff08;Weak Reference&#xff09;4. 虚引用&#xff08;Phantom Reference&#xff09; &#x1f496;The Begin&#x1f496;点点关注…

go-kratos 学习笔记(4) 服务注册与发现 nacos注册

接口实现​ Registry 接口分为两个&#xff0c;Registrar 为实例注册和反注册&#xff0c;Discovery 为服务实例列表获取 type Registrar interface {// 注册实例Register(ctx context.Context, service *ServiceInstance) error// 反注册实例Deregister(ctx context.Context…

大模型算法面试题(十二)

本系列收纳各种大模型面试题及答案。 1、领域模型Continue PreTrain数据如何选取 在领域模型的Continue PreTrain&#xff08;持续预训练&#xff09;过程中&#xff0c;数据选取是一个至关重要的步骤&#xff0c;它直接影响模型在特定领域上的性能和泛化能力。以下是一些关于…

【机器学习】深入理解损失函数(Loss Functions)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解损失函数(Loss Functions)什么是损失函数?常见损失函数类型1. 均方误差…

OSPF概述

OSPF OSPF属于内部网关路由协议【IGP】 用于单一自治系统【Autonomous System-AS】内决策路由 自治系统【AS】 执行统一路由策略的一组网络设备的组合 OSPF概述 为了适应大型的网络&#xff0c;OSPF在AS内划分多个区域 每个OSPF路由器只维护所在区域的完整的链路状态信息 …

谷粒商城实战笔记-62-商品服务-API-品牌管理-OSS整合测试

文章目录 一&#xff0c;Java中上传文件到阿里云OSS1&#xff0c;整合阿里云OSS2&#xff0c;测试上传文件 二&#xff0c;Java中整合阿里云OSS服务指南引言准备工作1. 注册阿里云账号2. 获取Access Key3. 添加依赖 实现OSS客户端1. 初始化OSSClient2. 创建Bucket3. 上传文件4.…

ElasticSearch(七)— 相关性检索和组合查询

一、 相关性评分 全文检索与数据库查询的一个显著区别&#xff0c; 就是它并不一定会根据查询条件 做完全精确的匹配。除了模糊查询以外&#xff0c;全文检索还会根据查询条件给文档的相关性打分并排序&#xff0c;将那些与查询条件相关性高的文档排在最前面。 相关性( Relev…

Cocos Creator2D游戏开发-(1)初始化设置

初心: 做一款微信或者抖音小游戏,然后发布,对于我来说这是一个新的赛道; 写这些文档的原因,记录一下自己学习过程,下次用的时候方便找 cocos creator版本: 3.8.3 当前小游戏飞机大战教程来源于: 抖音: 禅影 chanying001 源码目录: https://www.kdocs.cn/l/caLr6XCbEfPa 创建一个…

【CN】Argo 持续集成和交付(一)

1.简介 Argo 英 [ˈɑ:ɡəu] 美 [ˈɑrˌɡo] Kubernetes 原生工具&#xff0c;用于运行工作流程、管理集群以及正确执行 GitOps。 Argo 于 2020 年 3 月 26 日被 CNCF 接受为孵化成熟度级别&#xff0c;然后于 2022 年 12 月 6 日转移到毕业成熟度级别。 argoproj.github.i…

关键词查找【Knuth-Morris-Pratt (KMP) 算法】

一个视频让你彻底学懂KMP算法_哔哩哔哩_bilibili KMP算法的核心是利用匹配失败后的信息&#xff0c;尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 第一步&#xff1a;计算模式串(子串)和next[j]数组 模式串 前2位字母的next[j]固定是0 和 1 后续字母的nex[j]&…

MySql-函数

一、什么是函数&#xff1f; 数学函数 用作常规的数学运算&#xff1b; 字符串函数 对于字符串类型的字段处理&#xff1b; 日期时间函数 对于日期和时间类型的字段进行 处理&#xff1b; 聚合函数 常用于GROUP BY从句的 SELECT查询中&#xff1b; 自定义函数 根据实际需求…

Telegram曝零日漏洞,可伪装成视频攻击安卓用户

ESET Research在一个地下论坛上发现了一个针对Android Telegram的零日漏洞广告。 ESET将该漏洞命名为“EvilVideo”&#xff0c;并将其报告给Telegram&#xff0c;Telegram于7月11日更新了该应用程序。 EvilVideo允许攻击者发送恶意的有效载荷&#xff0c;这些载荷以视频文件…

Redis - SpringDataRedis - RedisTemplate

目录 概述 创建项目 引入依赖 配置文件 测试代码 测试结果 数据序列化器 自定义RedisTemplate的序列化方式 测试报错 添加依赖后测试 存入一个 String 类型的数据 测试存入一个对象 优化 -- 手动序列化 测试存入一个Hash 总结&#xff1a; 概述 SpringData 是 S…

PSINS工具箱函数介绍——insplot

insplot是一个绘图命令,用于将avp数据绘制出来 本文所述的代码需要基于PSINS工具箱,工具箱的讲解: PSINS初学指导使用方法 此函数使用起来也很简单,直接后面加avp即可,如: insplot(avp);其中,avp为: 每行表示一个时间1~3列为三轴姿态角(a),4-6列为三位速度(v),…

Milvus 向量数据库进阶系列丨部署形态选型

本系列文章介绍 在和社区小伙伴们交流的过程中&#xff0c;我们发现大家最关心的问题从来不是某个具体的功能如何使用&#xff0c;而是面对一个具体的实战场景时&#xff0c;如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

【BUG】已解决:ERROR: No matching distribution found for PIL

ERROR: No matching distribution found for PIL 目录 ERROR: No matching distribution found for PIL 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0…

自训练和增量训练word2vec模型

1、自己准备训练语料文件 根据自己的业务场景准备训练数据&#xff0c;比如用户在商城上的同购行为序列或同浏览行为序列。 我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。 1.1 准备语料库文件 # 示例&#xff1a;准备自己的一个大规模的语…

ASP.NET MVC

ASP.NET MVC与.NET Framework关系 .NET Framework是一个庞大的代码库&#xff0c;能为多种编程语言提供支持(如C#、VB、F#等)。同时.NET Framework 提供了多种技术框架&#xff0c;ASP.NET MVC是.NET Framework提供的众多技术框架中的一种&#xff0c;用于开发Web应用。 .NET …

C++如何在main函数开始之前(或结束之后)执行一段逻辑?

1. 问题2. 考察的要点3. 解决策略 3.1. 方案一&#xff1a;使用GCC的拓展功能3.2. 方案二&#xff1a;使用全局变量3.3. 方案三&#xff1a;atexit 4. Demo测试 4.1. 测试代码4.2. 执行结果 5. 程序异常退出场景 5.1. 存在的问题5.2. 解决方案 5.2.1. 原理5.2.2. 示例代码5.2.3…

【计算机网络】数据链路层实验

一&#xff1a;实验目的 1&#xff1a;学习WireShark软件的抓包操作&#xff0c;分析捕获的以太网的MAC帧结构。 2&#xff1a;学习网络中交换机互相连接、交换机连接计算机的拓扑结构&#xff0c;理解虚拟局域网&#xff08;WLAN&#xff09;的通信机制。 3&#xff1a;学习…