使用SSE流式输出(Javaweb前后端实战)
2025-06-24 12:01:13
来源:新华网
目录。
一.什么是SSE?f;
主要特征
二.SSE的实现过程:
三.SSE前端实现:
1.创建 EventSource 对象:
2.处理收到的信息:
3.处理特定事件:
4.处理连接错误问题:
5.关闭连接:
四.SSE后端实现:
1.导入web依赖:
2.创建Controller类:
3.介绍Seeemiter和使用方法:
(1). 构造方法。
(2). 发送数据。
(3). 关闭连接。
(4). 处理连接状态。
(5). 获得超时间。
(6). 其他。
1.SSE是什么?f;
SSE(Server-Sent Events)它是在Web应用程序中实现的。单向实时通信。的技术。通过SSE服务器可以主动向客户端发送更新,而且不需要客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端长连接)
主要特点:
- 单向通信。:数据从服务器流向客户端c;客户不能直接向服务器发送数据。
- 基于HTTP。:HTTP协议和#xff0c;简单易用支持浏览器。
- 自动重连。:如果连接丢失浏览器会自动尝试重连。
- 文本格式。:以文本流的形式发送数据,通常是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。
对象,它包含以下重要属性:
data。
:这是服务器发送的信息内容,通常是文本或JSON字符串。origin。
:URI表示事件来源c;通常是服务器的URL。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格式的字符串(例如。如果服务器发送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依赖:
org.springframework.boot spring-boot-starter-web
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")@Slf4jpublic 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; // 回到Sseeemitter实例 }}。
SseEmitter。
SseEmitter。实例。:创建。
SseEmitter。- 对象,准备将事件发送到前端。定时任务。
:使用。
ScheduledExecutorService。定期发送数据(如果当前时间戳)。发送失败(例如,关闭客户端连接),则调用。
completeWithError()。 - 处理异常。连接关闭处理。
:
onCompletion()。:当连接正常关闭时,调用#xff0c;清理资源。
onTimeout()。
:当连接超时时,关闭连接。
3.介绍Seeemiter和使用方法:
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,本期内容到此为止,感谢收看!!!也希望三连支持,感谢!!!