使用SSE流式输出(Javaweb前后端实战)

news2024/11/18 3:33:52

目录

一.什么是SSE?

主要特点:

二.SSE的实现过程:

三.SSE的前端实现:

1.创建 EventSource 对象:

2.处理接收到的信息:

3.处理特定事件:

4.处理连接错误问题:

5.关闭连接:

四.SSE的后端实现:

1.导入web依赖:

2.创建Controller类:

3.SeeEmitter的介绍以及使用方法:

(1). 构造方法

(2). 发送数据

(3). 关闭连接

(4). 连接状态处理

(5). 获取超时时间

(6). 其他


一.什么是SSE?

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

主要特点:

  1. 单向通信:数据从服务器流向客户端,客户端不能直接向服务器发送数据。
  2. 基于HTTP:SSE使用HTTP协议,简单易用,支持浏览器。
  3. 自动重连:如果连接丢失,浏览器会自动尝试重连。
  4. 文本格式:数据以文本流的形式发送,通常是UTF-8编码。

使用场景:频繁的更新数据,低延迟,单向通信

二.SSE的实现过程:

首先前端给后端发送请求,随后后端会返回响应文本流创建连接,然后后端就可以持续的长连接进行给前端传输数据。 

SSE 基于 HTTP 协议,利用了其长连接特性,通过浏览器向服务器发送一个 HTTP 请求,建立一条持久化的连接。SSE 可以传输文本和二进制格式的数据,但只支持单向数据流,即只能由服务器向客户端推送数据。

三.SSE的前端实现:

1.创建 EventSource 对象:

通过指定服务器端的SSE URL,创建一个EventSource实例。

const eventSource = new EventSource('http://localhost:8080/sse/chat');

2.处理接收到的信息:

使用onmessage事件处理程序接收服务器发送的消息。

eventSource.onmessage = function(event) {
    console.log('Received:', event.data);
    // 在这里处理接收到的数据,比如更新UI
};

接收到的event是一个MessageEvent对象,它包含以下重要属性:

  1. data:这是服务器发送的消息内容,通常是文本或JSON字符串。
  2. origin:表示事件来源的URI,通常是服务器的URL。
  3. lastEventId:如果浏览器重新连接,它会包含最后接收到的事件ID,这在处理丢失消息时非常有用。
eventSource.onmessage = function(event) {
    // event.data的结果假设是 '{"name": "Alice", "age": 25}'
    console.log('Received:', event.data); 
    // 如果是JSON格式,解析后 message 是一个对象: { name: "Alice", age: 25 }
    const message = JSON.parse(event.data); 
    // 在这里更新UI或进行其他操作
};

 SSE发送的数据是以文本流的形式传输的,通常是字符串(例如,JSON格式的字符串)。如果服务器发送的是JSON格式的字符串(例如 {"key": "value"}),那么你可以使用 JSON.parse() 将这个字符串转换为JavaScript对象,以便更方便地访问数据。

3.处理特定事件:

如果服务器发送了不同类型的事件,可以使用oneventname处理特定事件。

eventSource.addEventListener('customEvent', function(event) {
    console.log('Custom event received:', event.data);
});

4.处理连接错误问题:

可以使用onerror事件处理程序来处理连接错误。

eventSource.onerror = function(event) {
    console.error('EventSource failed:', event);
    // 可以在这里实现重连逻辑
};

5.关闭连接:

如果不再需要接收消息,可以通过调用close方法来关闭连接。

eventSource.close();

四.SSE的后端实现:

1.导入web依赖:

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

2.创建Controller类:

package com.itheima.bigdealboot.controller;


import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
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;

import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/sse")
@Slf4j
public class SSEController {
    
    @GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter sseChat(){
        SseEmitter emitter = new SseEmitter();

        // 创建一个定时任务
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        executor.scheduleAtFixedRate(() -> {
            try {
                // 发送当前时间戳
                emitter.send(System.currentTimeMillis());
            } catch (IOException e) {
                // 处理异常(如客户端关闭连接)
                emitter.completeWithError(e);
            }
        }, 0, 1, TimeUnit.SECONDS); // 每秒发送一次

        // 处理连接关闭
        emitter.onCompletion(() -> executor.shutdown());
        emitter.onTimeout(() -> {
            emitter.complete();
            executor.shutdown();
        });

        return emitter; // 返回SseEmitter实例
    }
}
  • SseEmitter实例:创建SseEmitter对象,准备向前端发送事件。
  • 定时任务:使用ScheduledExecutorService定期发送数据(如当前时间戳)。如果发送失败(例如,客户端关闭连接),则调用completeWithError()处理异常。
  • 连接关闭处理
    • onCompletion():当连接正常关闭时调用,执行资源清理。
    • onTimeout():在连接超时时关闭连接。

3.SeeEmitter的介绍以及使用方法:

SseEmitter 是 Spring框架提供的一个类,用于支持 Server-Sent Events (SSE)。

(1). 构造方法

  • SseEmitter():创建一个新的 SseEmitter 实例,使用默认的超时值。
  • SseEmitter(Long timeout):创建一个新的 SseEmitter 实例,设置指定的超时时间(毫秒)。

(2). 发送数据

  • send(Object data):发送数据到客户端。
  • send(Object data, MediaType mediaType):发送数据到客户端,并指定数据的媒体类型。
  • send(SseEvent event):发送一个 SseEvent 对象到客户端。

(3). 关闭连接

  • complete():正常完成事件流,关闭连接。
  • completeWithError(Throwable throwable):由于错误完成事件流,并关闭连接。
  • completeWithError(String message):由于错误完成事件流,并关闭连接,提供错误信息。

(4). 连接状态处理

  • onCompletion(Runnable callback):注册连接完成的回调函数。
  • onTimeout(Runnable callback):注册连接超时的回调函数。

(5). 获取超时时间

  • getTimeout():返回当前的超时时间(毫秒)。

(6). 其他

  • isCompleted():检查 SseEmitter 是否已完成。
  • isExpired():检查 SseEmitter 是否已过期。

OK,本期内容就到这里了,感谢收看!!!也希望三连支持一下,感谢!!!

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

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

相关文章

网络安全的方方面面

目录 一、网络安全概述二、数据加密三、消息完整性与数字签名四、身份认证五、密钥分发中心(KDC)与证书认证(CA)六、防火墙与入侵检测系统七、网络安全协议八、网络安全攻防 -- 黑客攻击简要流程九、网络安全常用术语 一、网络安全概述 网络安全的基本特征&#xff1a;相对性、…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(上篇:地图拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

基于Java的学生档案管理系统

基于springbootvue实现的学生档案管理系统 &#xff08;源码L文ppt&#xff09;4-065 第4章 系统设计 4.1 总体功能设计 学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面&#xff0c;支…

【Linux】图解详谈HTTPS的安全传输

文章目录 1.前置知识2.只使用对称加密3.只使用非对称加密 因为私钥加密只能公钥解开&#xff0c;公钥加密只能私钥解开4.双方都是使用非对称加密5.非对称加密 对称加密6.非对称加密对称加密CA认证&#xff08;一&#xff09;CA认证&#xff08;二&#xff09;https &#xff0…

耳夹式耳机哪个牌子好?主流耳夹式耳机推荐,多维度耳夹式耳机测评

耳夹式耳机哪个牌子好&#xff1f;耳机已经逐渐走进了众多消费者的生活&#xff0c;可以非常便捷地满足人们的对声音的需求&#xff0c;无论是在享受音乐还是接听电话方面都非常方便&#xff0c;极大地提升了生活的便利性。然而&#xff0c;随着耳夹式耳机的热度不断攀升&#…

IDEA插件开发入门

前置条件: Java17、Gradle8 1. 安装插件 Plugin DevKit 2. 新建项目 File → New → Project 3. 项目结构 &#x1f4e2; 新建一个XxxAction 4. 插件入口 XxxAction 继承 AnAction &#xff0c;实现 actionPerformed 方法&#xff0c;这是一个插件的入口 5. 插件配置 …

裸辞后勇闯AI领域:我的AGI产品经理之路

2021 年&#xff0c;我开始接触生成式 AI。2023 年 8 月&#xff0c;我按捺不住内心对 AI 技术浪潮的热情&#xff0c;从外企裸辞投身 AI。2023 年&#xff0c;我们团队先后入围由百度和阿里组织的 AGI 黑客马拉松活动&#xff0c;并在阿里第三季 AI 创客松中获得“从 0 到 1 奖…

远程唤醒局域网主机技术Wake On LAN

WOL用途 如果你在开发一个计算机管理软件&#xff08;利旧现有主机&#xff0c;实现统一运维管理&#xff09;&#xff0c;例如电脑课开课前老师一键开启电教室的电脑 。 魔法原理 Wake-on-LAN 的原理其实很简单。我们发送一个特殊的网络包&#xff08;俗称"魔术包&quo…

学生党头戴式蓝牙耳机怎么选?平价学生党头戴式蓝牙耳机排行推荐

在选择适合学生党的头戴式蓝牙耳机时&#xff0c;我们不仅要考虑价格因素&#xff0c;还要兼顾音质、舒适度、降噪效果、续航能力以及是否具备实用的功能等多个方面&#xff0c;那么学生党头戴式蓝牙耳机怎么选&#xff1f;作为学生群体&#xff0c;我们既追求性价比&#xff0…

微软推出GRIN-MoE:开创专家路由新范式

前沿科技速递&#x1f680; 在人工智能领域&#xff0c;模型的性能和可扩展性一直是研究的热点。微软最近推出的GRIN-MoE&#xff08;Gradient-Informed Mixture-of-Experts&#xff09;模型&#xff0c;以其独特的架构和显著的性能表现&#xff0c;正引领着AI技术的前沿&#…

南沙csp-j/s一对一家教 解一本通题: 1937:【06NOIP普及组】数列

【题目描述】 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列&#xff0c;例如&#xff0c;当k3时&#xff0c;这个序列是&#xff1a; 1&#xff0c;3&#xff0c;4&#xff0c;9&#xff0c;10&#xff0c;12&#xff0c;13&a…

一文读懂Ingress-Nginx以及实践攻略

一文读懂Ingress-Nginx以及实践攻略 目录 1 概念 1.1 什么是Ingress&#xff1f; 1.1.1 主要功能&#xff1a; 1.2 Ingress的组件1.3 什么是ingress-nginx1.4 ingress-nginx优点和限制1.5 版本兼容性矩阵 2 实践&#xff1a; Ingress nginx部署 2.1 使用helm部署ingress-ngin…

cscode搭建vue项目

创建前安装环境 ctrlj弹出终端 window需要管理员运行并且授权 node -v #显示版本号&#xff0c;说明 node 已经装好 npm -v #显示版本号&#xff0c;说明 npm 可以使用 # 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm -v #显示版本号&…

10分钟制作一个简易的word模版

简易word模板制作。 简言 自用的一个word模版&#xff0c;平常套用其他格式的模板&#xff0c;常常将注意力转移到寻找word模版上&#xff0c;这里提供一个简易的word模版制作教程。 格式要求 &#xff08;1&#xff09;正文格式字体小四&#xff0c;中文宋体&#xff0c;西…

SpringCloud 2023 Gateway的Predicate配置详解、自定义Route Predicate Factory

目录 1. Predicate Factories介绍2. 常用的内置Route Predicate使用2.1 配置语法说明2.2 配置使用 3. 自定义Route Predicate Factory3.1 实现步骤&#xff1a;3.2 实现代码如下&#xff1a;3.3 application.yml配置3.4 测试 1. Predicate Factories介绍 Spring Cloud Gateway…

数字货币交易所开发与智能合约交易系统

数字货币交易所作为加密经济的重要组成部分&#xff0c;为用户提供了一个安全、便捷的平台来买卖各种数字资产。随着区块链技术的发展&#xff0c;智能合约在交易所的应用日益普及&#xff0c;使得交易过程更加高效和透明。本文将探讨数字货币交易所的开发过程以及智能合约在交…

Spring源码学习:SpringMVC(2)DispatcherServlet初始化【子容器9大组件】

目录 DispatcherServlet类图HttpServletBean#initnew ServletConfigPropertyValues() FrameworkServlet#initServletBeaninitWebApplicationContextcreateWebApplicationContextconfigureAndRefreshWebApplicationContext DispatcherServlet内部9大组件初始化初识9大组件Dispat…

大模型还能产生幻觉?一文讲清楚原理和解决方法

“像我们这样相信物理学的人都知道&#xff0c;过去、现在和未来之间的区别只是一种顽固执着的幻觉。换句话说&#xff0c;时间是一种幻觉。” ——波尔 幻觉&#xff0c;即一种看似真&#xff0c;实为假的感受。最近接触到了一个概念&#xff1a;大模型幻觉。有点好奇&#…

【Qt | QList 】QList<T> 容器详细介绍和例子代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-09-26 …