SpringBoot整合SSE技术详解

devtools/2024/9/22 14:49:05/

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控制器

java">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>javascript">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.ppmy.cn/devtools/86222.html

相关文章

用Java手写jvm之模拟运行时数据区的虚拟机栈,局部变量表,操作数栈等

写在前面 下图是jvm的运行时数据区内存图&#xff1a; &#xff0c;本文要模拟的是虚拟机栈的相关内存结构的交互过程。 1&#xff1a;正文 因为我们这里模拟的是线程执行方法调用的过程&#xff0c;所以这里先来定义一个线程对象&#xff1a; public class Thread {// 程…

解决 Git 访问 GitHub 时的 SSL 错误

引言 在使用 Git 进行版本控制时&#xff0c;我们可能会遇到各种网络相关的错误。其中一种常见的错误是 SSL 连接问题&#xff0c;这会导致 Git 无法访问远程仓库。本文将介绍一个具体的错误 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0&#xff0c;以及如何通过禁用 SSL 证…

Vue 3组件通信13种方法

文章目录 前言1. 父组件向子组件传递数据 (Props)父组件:子组件:2. 子组件向父组件传递数据 (Emit)子组件:父组件:3. 兄弟组件通信 (Mitt)发送事件的组件:接收事件的组件:4. 透传 Attributes ($attrs)父组件:子组件:5. 模板引用 (Refs)父组件:子组件:6. 双向绑定 (v-model)父组…

EXCEL 排名(RANK,COUNTIFS)

1.单列排序 需求描述&#xff1a;如有下面表格&#xff0c;需要按笔试成绩整体排名。 解决步骤&#xff1a; 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列&#xff08;CtrlShift向下箭头、再按F4&#xff09;。 "确定"即可计算…

DATE_ADD、DATE_SUB Function - Mysql

DATE_ADD、DATE_SUB Function - SQL DATE_ADD() 和 DATE_SUB() 用于在日期或日期时间上增加或减少指定的时间间隔。 1. DATE_ADD() DATE_ADD() 函数用于向指定的日期或日期时间值添加一个时间间隔。 DATE_ADD(date, INTERVAL expr unit)date: 要添加时间间隔的日期或日期时间…

【Python数据结构与算法】递归----N皇后问题

题目&#xff1a;N皇后问题 描述 国际象棋的棋盘是由88共64个方格构成&#xff0c;棋子放在方格里面。如果两个皇后棋子在同一行、同一列&#xff0c;或者在某个正方形的对角线上&#xff0c;那么这两个皇后就会互相攻击。请在棋盘上摆放8个皇后&#xff0c;使得它们都不会互相…

论文《Few-Shot Object Detection with Model Calibration》的解读

《Few-Shot Object Detection with Model Calibration》论文的解读 作者&#xff1a;Qi Fan1, Chi-Keung Tang1 , and Yu-Wing Tai1,2 单位&#xff1a;1 The Hong Kong University of Science and Technology, 2 Kuaishou Technology 邮箱&#xff1a;fanqicsgmail.com, ckta…

OWASP ZAP:一款功能强大的开源Web安全扫描工具

目录 介绍 安装和配置 下载和安装 启动和配置 主界面概述 基本功能 自动扫描 手动测试 被动扫描 主动扫描 高级功能 代理功能 Fuzzer API 插件和扩展 使用场景 开发阶段 测试阶段 生产环境 实践案例 案例一&#xff1a;自动化扫描 案例二&#xff1a;手动…