SSE(Server-Sent Events)
时间: 2024-07-24 17:00:33 浏览: 180
SSE (Server-Sent Events) 是一种在 Web 开发中用于实时数据推送的技术。它允许服务器向客户端发送持续的数据流,而无需客户端频繁地发起请求。SSE 实现了单向通信,即服务器主动向浏览器推送数据,而浏览器不会发起请求,除非用户离开页面或关闭连接。
SSE 工作原理如下:
1. **连接建立**:服务器创建一个 HTTP 长连接,并设置 Content-Type 为 'text/event-stream',告诉浏览器这是一个事件流。
2. **事件推送**:服务器通过 `data:` 前缀和换行符分隔的文本块来发送事件,每个事件通常包含一个事件名称和可选的事件数据。
3. **事件标识**:每个事件通常会有一个事件标识符,但不是必需的,用于标识特定的事件类型。
4. **断线处理**:如果客户端不再接收事件或断开连接,服务器会自动关闭连接,客户端也可以通过指定超时时间或关闭连接请求来结束连接。
相关问题
SSE(Server-Sent Events)
### 什么是 Server-Sent Events (SSE)
Server-Sent Events (SSE) 是一种基于 HTTP 的技术,允许服务器向客户端推送实时更新的数据流。它是一种单向通信机制,适合用于需要从服务器到客户端持续传输数据的应用场景[^1]。
---
### SSE 的主要特点
- **单向通信**:SSE 只支持从服务器到客户端的单向数据流,不支持双向通信。
- **低延迟**:相比轮询或其他传统方法,SSE 提供更低的延迟和更高的效率。
- **标准协议**:SSE 基于 HTTP 协议,兼容性强,易于实现。
- **事件驱动模型**:可以通过自定义事件名称来区分不同的消息类型。
---
### SSE 的基本工作原理
当客户端请求一个支持 SSE 的资源时,服务器会保持连接并定期发送数据直到连接关闭或超时。每次发送数据时,服务器可以指定特定的消息格式和元信息,例如事件名称、重试时间等[^2]。
---
### 实现 SSE 的关键要素
#### 客户端部分
在浏览器中,JavaScript 提供了一个 `EventSource` 对象,用于监听来自服务器的事件流。以下是创建 `EventSource` 并处理接收到的消息的基本语法:
```javascript
const eventSource = new EventSource('/stream');
eventSource.onmessage = function(event) {
console.log('New message:', event.data);
};
eventSource.onerror = function(err) {
console.error('Error occurred:', err);
};
```
#### 服务端部分
服务端需要返回带有特殊 MIME 类型 (`text/event-stream`) 的响应头,并按照 SSE 的格式发送数据。以下是一个通用的服务端响应结构:
```http
HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
Access-Control-Allow-Origin: *
```
每条消息应遵循如下格式:
```
id: <id>\n
event: <event-name>\n
data: <json-data>\n\n
```
其中:
- `id`: 消息唯一标识符(可选)。
- `event`: 自定义事件名(可选)。
- `data`: 要发送的实际数据。
---
### 使用 Go 实现 SSE 示例
以下是在 Go 中实现 SSE 的简单示例代码:
```go
package main
import (
"fmt"
"net/http"
"time"
)
func streamHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
for i := 0; ; i++ {
fmt.Fprintf(w, "data: Message %d at %v\n\n", i, time.Now())
w.(http.Flusher).Flush()
time.Sleep(1 * time.Second)
}
}
func main() {
http.HandleFunc("/stream", streamHandler)
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic(err)
}
}
```
此代码启动了一个简单的 SSE 流服务,在 `/stream` 路径下不断发送带有时戳的消息。
---
### 使用 Spring Boot 实现 SSE 示例
如果使用 Java 和 Spring Boot,则可通过控制器中的 `TextEventStream` 返回值轻松实现 SSE 功能。下面是一个完整的例子:
```java
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
public class SseController {
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamEvents() {
return Flux.interval(Duration.ofSeconds(1))
.map(sequence -> LocalDateTime.now() + " : " + sequence);
}
}
```
在此示例中,Spring Boot 利用了反应式编程库 `Flux` 来生成定时器触发的消息流[^2]。
---
### 总结
无论是使用 Go 还是 Spring Boot,SSE 都能以较低复杂度实现实时数据推送的功能。对于只需要单向通信且不需要 WebSocket 复杂性的应用场景来说,SSE 是一个非常合适的选择。
---
SSE(Server-Sent Events)是什么?过程
SSE(Server-Sent Events)是一种Web API,用于在客户端和服务器之间实现服务器发送事件。SSE允许服务器向客户端推送数据,而无需客户端发送请求。这种单向数据流的实现方式,使得SSE比WebSocket更加轻量级,适用于一些简单的推送场景。
SSE的工作原理如下:
1. 客户端通过EventSource对象连接到服务器的SSE端点。
2. 服务器将一个HTTP响应返回给客户端,其中包含SSE的响应头(Content-Type: text/event-stream)和一个空行。
3. 服务器将一系列文本数据(称为事件)作为HTTP响应正文发送回客户端。每个事件都以“event:”开头,后面跟着事件名称,然后是一个或多个“data:”行,其中包含事件数据。每个事件以两个换行符结束。
4. 客户端接收到事件后,将事件数据插入到DOM中,从而实现动态更新页面的效果。
SSE的特点是简单易用、可靠性高、传输效率高、兼容性好。但是,SSE只支持单向数据流,无法实现双向通信。如果需要实现双向通信,需要使用WebSocket协议。
阅读全文
相关推荐
















