首页 > 其他分享 >SpringBoot整合SSE技术详解

SpringBoot整合SSE技术详解

时间:2024-07-23 23:53:38浏览次数:17  
标签:WebSocket SpringBoot 详解 服务器 SSE import 客户端

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。

标签:WebSocket,SpringBoot,详解,服务器,SSE,import,客户端
From: https://blog.csdn.net/shy_1762538422/article/details/140648873

相关文章

  • 基于SpringBoot+Vue+uniapp的企业人才引进服务平台的详细设计和实现(源码+lw+部署文档
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Java之this关键字详解
    this关键字在类中的普通成员方法中,可以使用this关键字,其表示调用当前方法的对象引用,即哪个对象调用该方法,this就代表哪一个对象。this关键字用法:对成员变量和局部变量进行区分固定格式:this.数据成员;调用类中的成员方法固定格式:this.成员方法(实际参数列表);调用......
  • 一文详解Type C-CC引脚的作用
    一文详解TypeC-CC引脚的作用关于USBCC引脚的功能,想必很多人都很好奇。USB经常接触,其内部的VBUSD+与D-大家肯定都知道了解,但对于CC引脚的存在却很少有人知道其作用。所以呢,今日,小白就来简单的介绍一下其功能。首先还是要先介绍几个关键名词:DFP(DownstreamFacingPort)下行端口......
  • 从源码角度详解Golang调度GMP
    文章目录从源码角度详解Golang调度GMP1.1调度器的三个抽象概念:G、M、P1.2调度的大致轮廓2.进程启动时都做了什么2.1runtime.osinit(SB)方法针对系统环境的初始化2.2runtime.schedinit(SB)调度相关的一些初始化2.3runtime·mainPC(SB)启动监控任务2.4......
  • Apache Kafka 使用详解
    文章目录引言官网链接Kafka原理核心概念工作原理基础使用安装与启动生产者示例消费者示例高级使用KafkaStreams示例:单词计数KafkaConnect示例:使用KafkaConnect将MySQL数据导入Kafka优缺点优点缺点结论引言ApacheKafka是一个分布式流处理平台,由LinkedIn......
  • springboot学习笔记 1 - Spring Boot 简介
    SpringBoot学习笔记什么是SpringBootSpringBoot的特点SpringBoot与Spring的区别开发环境要求使用SpringInitializr创建项目构建并运行第一个SpringBoot应用代码示例总结什么是SpringBoot大家好,欢迎来到“SpringBoot学习笔记”系列。首先,让我们从一个简单......
  • springboot 使用 rocketMQ
    POM依赖<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version></dependency>配置文件rocketmq:name-server:192.168.20......
  • 计算机编程—IT实战课堂 Springboot 电竞兴趣论坛系统
    计算机编程—IT实战课堂:Springboot电竞兴趣论坛系统随着电子竞技行业的迅猛发展,电竞爱好者对于交流平台的需求日益增长。结合IT实战课堂的教学实践,我们利用SpringBoot框架开发了一款集讨论、资源共享、赛事追踪于一体的电竞兴趣论坛系统。本文将深入探讨该项目的构思背景、......
  • 创建SpringBoot项目时出现Cannot resolve plugin org.springframework的解决方法 原
    创建SpringBoot项目时出现Cannotresolvepluginorg.springframework的解决方法原因是添加依赖时未添加版本号原因是添加依赖时未添加版本号解决方法:在pom.xml文件中的依赖添加版本号原来:<plugin><groupId>org.springframework.boot</groupId><a......
  • 【分享】WinRAR五大实用功能详解:让文件管理更高效
    WinRAR作为一款功能强大的压缩和解压缩工具,拥有许多实用功能。今天来分享其中的5个功能,一起来看看这些功能如何设置吧!功能一:文件压缩文件压缩是WinRAR的基本功能,通过压缩文件可以减少存储空间和传输时间。1.选择要压缩的目标文件或文件夹,右键点击并选择【添加到压缩文件.........