分享缩略图

分享到:
链接已复制
首页> 新闻中心>

使用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󿀌服务器可以主动向客户端发送更新,而且不需要客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端󿀌长连接)

主要特点:

  1. 单向通信。:数据从服务器流向客户端c;客户不能直接向服务器发送数据。
  2. 基于HTTP。:HTTP协议和#xff0c;简单易用�支持浏览器。
  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࿰表示事件来源c;通常是服务器的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格式的字符串(例如。如果服务器发送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实例    }}。

:当连接超时时,关闭连接。

3.介绍Seeemiter和使用方法:SseEmitter。

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

实例,设置指定的超时间(毫秒)。

对象到客户端。

:因错误完成事件流󿀌关闭连接,提供错误的信息。

:加时回调函数注册连接。

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


是否过期。

OK,本期内容到此为止,感谢收看!!!也希望三连支持,感谢!!!

【责任编辑:新华网】
返回顶部