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.mzph.cn/diannao/50763.shtml

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

相关文章

python-学生排序(赛氪OJ)

[题目描述] 已有 a、b 两个链表&#xff0c;每个链表中的结点包括学号、成绩。要求把两个链表合并&#xff0c;按学号升序排列。输入格式&#xff1a; 输入共 NM1 行。 第一行&#xff0c;输入 a、b 两个链表元素的数量 N、M&#xff0c;中间用空格隔开。下来 N 行&#xff0c;…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十章 Linux用户层和内核层

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

找工作准备刷题Day10 回溯算法 (卡尔41期训练营 7.24)

回溯算法今天这几个题目做过&#xff0c;晚上有面试&#xff0c;今天水一水。 第一题&#xff1a;Leetcode77. 组合 题目描述 解题思路 从题目示例来看&#xff0c;k个数是不能重合的&#xff0c;但是题目没有明确说明这一点。 使用回溯算法解决此问题&#xff0c;利用树形…

ElasticSearch搜索

ES搜索 elastic search 一套搜索引擎技术,主要技术栈包括 Elasticsearch&#xff1a;用于数据存储、计算和搜索 Kibana&#xff1a;用于数据可视化 在数据库模糊查询中,因为不走索引,所以效率很低,而在搜索引擎中,不仅效率高,而且即使出现个别错字,或者用拼音搜索,甚至用同…

docker安装sql server容器

安装 docker pull mcr.microsoft.com/mssql/server:2017-latest启动 docker run -e "ACCEPT_EULAY" -e "SA_PASSWORDwjl135246" -p 1433:1433 -m 4000M --memory 4000M --name sqlserver -d mcr.microsoft.com/mssql/server:2017-latest远程链接即可 参…

用户登录安全是如何保证的?如何保证用户账号、密码安全?

1.HTTP协议直接传输密码&#xff08;无加密&#xff09; 前端 直接发送HTTP请求&#xff08;无加密&#xff09;&#xff0c;攻击者可直接捕获网络包&#xff0c;看到下面的明文信息 因此&#xff0c;使用HTTP协议传输会直接暴露用户敏感信息。 2.HTTPS协议直接传输密码&…

Postgresql 16开启SELINUX

平时我们习惯了&#xff0c;安装数据库&#xff0c;就关闭SELINUX&#xff0c;不关闭SELINUX&#xff0c;就不会安装数据库了&#xff0c;那么不关闭SELINUX&#xff0c;就不能安装数据库了吗&#xff1f; 答案是否定的。 不过&#xff0c;如果我们在开启SELINUX情况下安装PG…

Matlab类阿克曼车机器人运动学演示

v1是后驱动轮轮速&#xff0c; v2是转向角变化速度&#xff0c; 实际上我们只需要关注XQ&#xff0c; YQ和Phi的变化率。 通过这三项和时间步长&#xff0c; 我们就可以计算出变化量&#xff0c; 再结合初始值就能推断出每个时刻的值。 % 清理当前运行环境 % 清除所有变量 cle…

opencv使用KCF算法跟踪目标,给出目标中心位置

效果图 代码 import cv2class VideoTracker:def __init__(self, video_path: str):self.video_path video_pathself.cap cv2.VideoCapture(video_path)self.tracker cv2.legacy.TrackerKCF_create()self.initBB Noneself.tracker_initialized Falseself.selecting Fals…

【教程】vscode添加powershell7终端

win10自带的 powershell 是1.0版本的&#xff0c;太老了&#xff0c;更换为powershell7后&#xff0c;在 vscode 的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程 打开vscode终端配置 然后来到这个页面进行设置 查看 powershell7 的安装位置&#xff…

韦东山嵌入式linux系列-异常与中断的概念及处理流程

1 中断的引入 一些概念&#xff1a; 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运…

数据结构第二讲:顺序表

数据结构第二讲&#xff1a;顺序表 1.线性表2.什么是顺序表3. 静态顺序表4.动态顺序表4.1顺序表基础4.2顺序表的初始化4.3顺序表的销毁4.4顺序表的尾插4.5顺序表的头插4.6顺序表的尾删4.7顺序表的头删4.8顺序表在指定位置之前插入数据4.9顺序表删除指定位置的数据4.10顺序表查找…

JNPF全新V5.0版本!重磅升级——全局优化篇

尊敬的JNPF用户们&#xff1a; 我们非常高兴地宣布&#xff0c;经过团队数月的辛勤努力和不断的技术创新&#xff0c;JNPF快速开发平台终于迎来了里程碑式的全新升级——V5.0版本&#xff01;这一版本的更新发布&#xff0c;不仅代表着我们技术实力的进一步提升&#xff0c;是…

大模型深度神经网络(Deep Neural Network, DNN)

大模型深度神经网络&#xff08;Deep Neural Network, DNN&#xff09;是一种复杂的机器学习模型&#xff0c;其特点在于包含多个隐藏层&#xff0c;从而赋予模型强大的非线性表达能力和对复杂数据模式的学习能力。以下是对大模型DNN的详细介绍&#xff1a; 一、基本概念 深度…

el-table列的显示与隐藏

需求&#xff1a;实现 表字段的显示与隐藏。效果图 代码实现 写在前面 首先 我部分字段有自定义的排序逻辑&#xff0c;和默认值或者 数据的计算 所以是不能简单的使用 v-for 循环column 。然后 我需要默认展示一部分字段&#xff0c;并且 当表无数据时 提示不能 显示隐藏 …

Flink-CDC解析(第47天)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. CDC 概述1.1 什么是CDC&#xff1f;1.2 CDC的实现机制1) 基于主动查询的 CDC&#xff1a;2) 基于事件接收CDC&#xff1a; 前言 本文主要概述了Flink-CDC. …

人工智能驱动的光学检测技术可阻止假冒芯片

欢迎关注GZH《光场视觉》 在过去的60年里&#xff0c;半导体行业已经蓬勃发展&#xff0c;成为了一个价值5000亿美元的全球市场。然而&#xff0c;这个行业正面临着两大挑战&#xff1a;新芯片的严重短缺和假冒芯片的激增。这两个问题不仅带来了巨大的故障风险&#xff0c;还导…

idea启动项目报:the command line via JAR manifest or via a classpath file and rerun.

解决方案 1.打开Edit Configurations&#xff0c;进去编辑&#xff0c;如下&#xff1a; 笔记配置 2.选择Modfiy options,点击Shorten command line 3.在新增的Shorten command line选项中选择JAR manifest或classpath file 4.点击保存后即可

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案

RK3588作为目前市面能买到的最强国产SOC&#xff0c;有强大的硬件配置。在智能汽车飞速发展&#xff0c;对图像数据矿场要求越来越多的环境下&#xff0c;如何高效采集数据&#xff0c;或者运行AI应用&#xff0c;成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…

leetcode日记(51)不同路径Ⅱ

和上一道题&#xff08;无障碍物的最短路径&#xff09;很像&#xff0c;但事实上比上一题多了优化方法 根据上一题改的代码如下&#xff0c;添加了对障碍物的判定&#xff0c;如果有障碍物则将数组值设为0。 class Solution { public:int uniquePathsWithObstacles(vector&l…