当前位置: 首页 > article >正文

Springboot通过SSE实现实时消息返回

Server-Sent Events(SSE)是一种从服务器向客户端推送实时消息的技术。相较于WebSocket,SSE更为简单,适用于大多数实时消息场景。本文将深入探讨如何使用Spring Boot通过SSE实现实时消息返回。

一、什么是SSE

SSE是一种允许服务器通过HTTP协议向客户端发送实时更新的技术。客户端只需发送一个简单的HTTP请求,然后保持连接打开,服务器可以在任意时间推送消息。SSE适用于实时性要求高,但双向通信需求不强的场景,如实时股票行情、新闻推送等。

二、Spring Boot中使用SSE

在Spring Boot中实现SSE相对简单,只需通过Controller返回SSE的响应流即可。

1. 创建Spring Boot项目

首先,创建一个基本的Spring Boot项目,并添加必要的依赖。

pom.xml

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
​
2. 编写Controller

接下来,创建一个控制器来处理SSE连接并推送实时消息。

SseController.java

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;@RestController
public class SseController {private final ExecutorService executorService = Executors.newCachedThreadPool();@GetMapping("/sse")public SseEmitter handleSse() {SseEmitter emitter = new SseEmitter();executorService.execute(() -> {try {for (int i = 0; i < 10; i++) {emitter.send("Message " + i, MediaType.TEXT_PLAIN);TimeUnit.SECONDS.sleep(1);}emitter.complete();} catch (IOException | InterruptedException e) {emitter.completeWithError(e);}});return emitter;}
}
​

上述代码创建了一个 /sse端点,当客户端连接到该端点时,服务器将通过SseEmitter对象每秒发送一条消息,共发送10条消息。

三、客户端实现

为了接收服务器推送的消息,客户端需要使用EventSource对象建立连接并处理接收到的消息。

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>SSE Demo</title>
</head>
<body><h1>Server-Sent Events Demo</h1><div id="messages"></div><script>const eventSource = new EventSource("/sse");eventSource.onmessage = function(event) {const messagesDiv = document.getElementById("messages");const message = document.createElement("div");message.textContent = event.data;messagesDiv.appendChild(message);};eventSource.onerror = function() {console.error("EventSource failed.");};</script>
</body>
</html>
​

在上述HTML文件中,使用 EventSource对象连接到 /sse端点,并通过 onmessage事件处理器显示接收到的消息。

四、SSE的优势与限制

优势
  1. 简单性:SSE基于HTTP协议,易于实现和维护。
  2. 自动重连:浏览器内置对SSE的支持,能够自动处理重连和断线恢复。
  3. 节省资源:SSE使用HTTP长连接,避免了轮询带来的资源浪费。
限制
  1. 单向通信:SSE仅支持服务器向客户端推送消息,不支持双向通信。
  2. 连接数限制:浏览器对每个域名的并发连接数有限制,SSE在大量客户端连接时可能受到影响。
  3. 不适合低延迟场景:对于需要超低延迟的应用场景,WebSocket可能更合适。
http://www.lryc.cn/news/2385087.html

相关文章:

  • SD-WAN技术详解:如何优化网络性能与QoS实现?(附QoS策略、链路聚合、网络架构对比)
  • 力扣-将x减到0的最小操作数
  • Web前端开发: 什么是JavaScript?
  • 三、【数据建模篇】:用 Django Models 构建测试平台核心数据
  • 【JAVA】比较器Comparator与自然排序(28)
  • shp2pgsql 导入 Shp 到 PostGIS 空间数据库
  • word设置如“第xx页 共xx页”格式的页码
  • DL00912-基于自监督深度聚类的高光谱目标检测含数据集
  • PostgreSQL架构
  • 文章记单词 | 第111篇(六级)
  • 在Java中,将Object对象转换为具体实体类对象
  • Runtipi - 开源个人家庭服务器管理工具
  • Vue3和React中插件化设计思想
  • 基于ResNet的医学影像辅助诊断系统
  • HJ106 字符逆序【牛客网】
  • 力扣HOT100之二叉树: 236. 二叉树的最近公共祖先
  • 腾讯音乐一面
  • 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
  • Pluto实验报告——基于2ASK的简易的通信系统
  • Python排序函数全面指南:从基础到高级
  • 深入了解redis的哈希槽的知识
  • 农业机械化、电气化和自动化知网英文普刊:1天录用,2周见刊发表!
  • java将rtsp转成flv在浏览器播放
  • Docker-Compose使用自定义网桥后在OpenWrt系统中容器无法访问网络解决方案
  • 界面组件DevExpress WPF中文教程:Grid - 行和卡片
  • Qt enabled + geometry 属性(2)
  • Llamaindex自学笔记(完)
  • 安全生态与职业跃迁
  • 飞书知识问答深度测评:企业AI应用落地的“范本级”产品
  • draw.io的基础与进阶使用指南