java Server-Sent Events
时间: 2025-07-06 21:55:23 浏览: 19
### 实现Java Server-Sent Events (SSE)
Server-Sent Events (SSE) 是一种允许服务器向客户端推送实时更新的技术,它基于HTTP协议,并通过持久化的连接实现数据的单向传输(从服务器到客户端)。在Java中,可以使用Spring框架中的`SseEmitter`类来实现实时通信。
#### 1. 添加项目依赖
首先,在`pom.xml`文件中添加必要的依赖项。确保项目支持Web开发和SSE功能:
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
```
#### 2. 后端代码实现
在Spring Boot应用程序中,可以通过创建一个控制器类来处理SSE请求。以下是一个简单的示例,展示如何使用`SseEmitter`向客户端发送事件:
```java
package com.example.sse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@RestController
public class SseController {
private final ExecutorService executor = Executors.newCachedThreadPool();
@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter handleSse() {
SseEmitter emitter = new SseEmitter(60_000L); // 设置超时时间为60秒
executor.execute(() -> {
try {
for (int i = 0; i < 5; i++) {
String message = "Event number " + (i + 1);
emitter.send(message);
Thread.sleep(2000); // 每隔两秒发送一次消息
}
emitter.complete(); // 完成发送
} catch (IOException | InterruptedException e) {
emitter.completeWithError(e); // 发生错误时完成
}
});
return emitter;
}
}
```
在这个示例中,`handleSse()`方法返回一个`SseEmitter`对象,该对象用于向客户端发送事件流。通过调用`emitter.send(message)`,可以将数据推送到客户端。
#### 3. 前端代码实现
前端可以使用JavaScript中的`EventSource` API来接收SSE事件。以下是一个简单的HTML页面示例,展示如何接收并显示服务器推送的消息:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SSE Example</title>
</head>
<body>
<h1>Server-Sent Events Example</h1>
<div id="messages"></div>
<script>
const eventSource = new EventSource('http://localhost:8080/sse');
eventSource.onmessage = function(event) {
const messageElement = document.createElement('p');
messageElement.textContent = 'Received: ' + event.data;
document.getElementById('messages').appendChild(messageElement);
};
eventSource.onerror = function(error) {
console.error('SSE error:', error);
};
</script>
</body>
</html>
```
在这个示例中,`EventSource`对象连接到服务器的`/sse`端点,并监听`onmessage`事件以接收服务器推送的消息。每当收到消息时,都会将其显示在页面上。
#### 4. 运行结果展示
当启动Spring Boot应用程序并在浏览器中打开上述HTML页面时,应该能够看到每隔两秒接收到一条新的消息,例如“Event number 1”,“Event number 2”等。
### 应用场景
SSE技术适用于需要服务器向客户端推送实时更新的场景,例如:
- **实时通知**:如系统警报、用户通知等。
- **股票市场实时更新**:提供最新的股价信息。
- **实时聊天应用**:虽然SSE主要用于单向通信,但在某些情况下也可以用于简单的聊天应用[^2]。
### 总结
通过使用Spring Boot提供的`SseEmitter`类,可以轻松地在Java应用中实现Server-Sent Events (SSE)。这种方法不仅简单易用,而且能够有效地支持实时通信需求。此外,结合前端的`EventSource` API,可以方便地接收和处理服务器推送的数据[^4]。
阅读全文
相关推荐


















