Server-Sent Events
时间: 2025-04-21 15:45:51 浏览: 35
### Server-Sent Events (SSE) 技术介绍
Server-Sent Events (SSE) 是 HTML5 引入的一种技术,允许服务器向浏览器客户端单向推送实时数据。这种机制非常适合用于需要服务器主动推送信息给客户端的应用场景,比如股票价格更新、社交网络消息提醒或是体育赛事比分直播等。
#### SSE 的特点
- **单向通信**:仅支持从服务器到客户端的数据传输。
- **基于HTTP协议**:建立在现有的 HTTP 协议之上,不需要额外的握手过程。
- **自动重连**:如果连接断开,浏览器会尝试重新连接。
- **事件驱动模型**:可以定义不同的事件类型以便更灵活地处理接收到的消息[^1]。
### 使用 Spring Boot 实现 SSE
为了在 Spring Boot 应用程序中实现 SSE 功能,开发者可以通过添加特定依赖项以及编写相应的控制器和服务逻辑来完成这一目标。下面是一个简单的例子展示如何设置一个基本的 SSE 推送服务:
#### 添加 Maven 或 Gradle 依赖
对于 Maven 用户,在 `pom.xml` 文件内加入如下配置以引入必要的库:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
```
而对于使用 Gradle 构建系统的项目,则应在 build.gradle 中添加相应的内容:
```groovy
implementation 'org.springframework.boot:spring-boot-starter-web'
```
#### 创建 Controller 类
接下来创建一个名为 SseController.java 的 Java 类作为 RESTful API 控制器,负责接收来自前端页面的订阅请求并向其发送通知:
```java
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@RestController
public class SseController {
@GetMapping(value="/stream", produces= MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter handle() throws InterruptedException {
final var emitter = new SseEmitter();
// 设置超时时间, 防止长时间未响应被关闭.
emitter.onCompletion(() -> System.out.println("Connection closed"));
emitter.onError((e)->System.err.println(e.getMessage()));
for(int i=0; i<=10 ;i++){
try{
Thread.sleep(1000); // 模拟延迟
emitter.send(SseEmitter.event()
.id(String.valueOf(i))
.name("time")
.data(LocalDateTime.now().toString())
);
} catch(Exception e){
emitter.completeWithError(e);
break;
}
}
return emitter;
}
}
```
这段代码实现了每秒钟向已订阅此端点 `/stream` 的所有客户发出一次当前的时间戳字符串表示形式的通知。一旦完成了十次迭代之后就会结束整个流程并关闭链接[^2]。
#### 测试应用程序
启动 Spring Boot 应用后,在浏览器地址栏输入 http://localhost:8080/stream 并回车访问该 URL 地址即可查看效果;也可以通过 JavaScript 编写一段脚本来监听这些事件并在网页界面上显示出来。
### 注册 SseEmitter
每当有新的客户端发起 SSE 请求时,服务器都会实例化一个新的 `SseEmitter` 对象,并可能将其保存起来供后续操作之用——例如广播相同主题下的最新状态变更给所有的在线听众们。这通常涉及到维护一个线程安全集合用来管理活动中的发射器列表[^3]。
阅读全文
相关推荐


















