在Web开发领域,SSE是一种让服务器能够实时向客户端推送更新的技术,它是HTML5规范的一部分。通过创建一个持久化的HTTP连接,服务器可以持续不断地将数据以text/event-stream格式推送给浏览器端的JavaScript应用程序。客户端打开一个到服务器的SSE连接后,服务器在有新事件发生时,会在该连接上发送事件数据,而客户端则可以通过监听这些事件来实时更新用户界面或执行其他操作。相比轮询或其他长轮询机制,SSE能更有效地利用网络资源,并且实现更简单,适用于实时更新但不要求双向通信的场景。我们通常称这种方案为“服务端消息推送轻量化方案”。
以Spring Boot为例,实现Server-Sent Events(SSE)服务器推送技术的步骤如下:
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
public class SseController {
@GetMapping(path = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> sseStream() {
return Flux.interval(Duration.ofSeconds(1)) // 每隔一秒生成一个新的事件
.map(sequence -> "data: {" + System.currentTimeMillis() + "}\n\n"); // 生成包含时间戳的数据字符串
}
}
上述代码中的Flux.interval()用于产生一个按固定间隔推送事件的流。在每个事件中,我们构造了一个简单的JSON格式的时间戳消息体。注意,SSE消息必须遵循一定的格式,即每条消息由"data:"开头,消息内容后面跟有两个换行符来表示一个完整事件的结束。
const source = new EventSource('/sse');
source.onmessage = function(event) {
console.log('Received data:', event.data);
};
source.onerror = function(error) {
console.error('Error occurred:', error);
};
以上代码会在浏览器中创建一个新的EventSource实例,指向服务器上的SSE资源地址。每当服务器有新事件到达时,onmessage回调函数会被调用,并且可以通过event.data访问到事件的内容。 这样就完成了基于Spring Boot的SSE功能的基本实现,可以根据实际需求调整推送的内容和频率。
Flux.interval() 是在Reactor框架中用于生成定期连续事件的函数式API,它属于Project Reactor(基于Java 8的反应式编程库),并广泛应用于Spring WebFlux项目。当调用 Flux.interval(Duration period) 方法时,它会创建一个 Flux 流,该流按指定的时间间隔(以 Duration 表示)持续产生 Long 类型的值。 原理概述:
(下一篇:聊天室的诞生,WebSocket的前世今身)
评论