赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
我会在本章介绍SSE接口的几种实现方式,包括webflux和spring mvc,以及使用几种方法调用sse接口的方法。
SSE 接口" 通常指的是 Server-Sent Events(SSE)接口。Server-Sent Events 是一种用于在客户端和服务器之间实现单向实时通信的 web 技术。它允许服务器向客户端推送事件,而客户端通过简单的 JavaScript 代码监听这些事件。
SSE 主要用于实现服务器向客户端的实时更新,例如推送新闻、实时股票报价、即时通讯等场景。与其他实时通信技术(如 WebSocket)相比,SSE 是一种简单的、基于 HTTP 的轻量级解决方案,适用于一些场景下不需要双向通信的应用。
WebFlux 是基于响应式编程模型的框架,支持反应式流和非阻塞 I/O。
使用 Flux 或 Mono 类型来表示 SSE 数据流。
Spring MVC 是传统的 Servlet 模型,采用同步阻塞的方式处理请求和响应。
在 Spring MVC 中,使用 SseEmitter 类来处理 SSE 数据流。
使用 Flux 或 Mono 类型,其中 ServerSentEvent 对象包装 SSE 数据。
适用于响应式、非阻塞的场景。
使用 SseEmitter 类,可以发送任意类型的数据,不仅仅是 ServerSentEvent。
SseEmitter 提供更大的灵活性,可以发送任何类型的数据。
WebFlux 与整个响应式编程框架集成,更适用于构建响应式、非阻塞的应用程序。
Spring MVC:
传统的 Servlet 模型,适用于同步处理请求的应用程序。
@RestController
@RequestMapping("/api")
public class SSEController {
@GetMapping("/stream")
public Flux<ServerSentEvent<String>> handleStream() {
return Flux.interval(Duration.ofSeconds(1))
.map(index -> ServerSentEvent.builder("Data: " + index).build());
}
}
@RestController
@RequestMapping("/api")
public class SSEController {
@GetMapping("/stream")
public SseEmitter handleStream() {
SseEmitter emitter = new SseEmitter();
// 设置 SSEEmitter 的处理逻辑
// ...
emitter.send(data);
return emitter;
}
}
import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; public class WebClientSSEExample { public static void main(String[] args) { WebClient webClient = WebClient.create("http://your-server"); Flux<String> sseFlux = webClient.get() .uri("/api/stream") .retrieve() .bodyToFlux(String.class); sseFlux.subscribe(eventData -> { System.out.println("Received Event: " + eventData); }); } }
import okhttp3.*; import okhttp3.Request.Builder; import okhttp3.Response; import okhttp3.sse.EventSource; import okhttp3.sse.EventSourceListener; public class OkHttpSSEExample { public static void main(String[] args) { OkHttpClient client = new OkHttpClient(); Request request = new Builder().url("http://your-server/api/stream").build(); EventSourceListener listener = new EventSourceListener() { @Override public void onEvent(String id, String type, String data) { System.out.println("Received Event: " + data); } @Override public void onFailure(Exception e, Response response) { e.printStackTrace(); } }; EventSource eventSource = new EventSource(request, listener); eventSource.start(); } }
import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; public class WebClientSSEExample { public static void main(String[] args) { WebClient webClient = WebClient.create("http://your-server"); Flux<String> sseFlux = webClient.get() .uri("/api/stream") .retrieve() .bodyToFlux(String.class); String last = sseFlux.blockLast(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。