服务端向客户端推送消息,除了可以用WebSocket这种耳熟能详的机制外,还有一种服务器发送事件(Server-sent events),简称SSE。WebSocket和SSE都是用于实现服务器向客户端推送数据的技术。
SSE是基于Http协议的,相比WebSocket,它更轻量,但是它只能从服务端向客户端单向发送信息。WebSocket架构在客户端与服务器之间打开一个套接字,用于实现全双工(双向)通信。
ChatGPT的流式API是基于SSE(Server-Sent Events)的。
下面是一个使用SseEmitter的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @GetMapping("/sse") public SseEmitter sse() { SseEmitter emitter = new SseEmitter(); executorService.execute(() -> { try { for (int i = 0; i < 10; i++) { emitter.send("SSE Test #" + i + " at " + new Date()); Thread.sleep(1000); } emitter.complete(); } catch (Exception ex) { emitter.completeWithError(ex); } }); return emitter; }
|
在前端,可以使用JavaScript来接收服务端推送的数据。下面是一个使用JavaScript的例子:
1 2 3 4
| var source = new EventSource('/sse'); source.onmessage = function(event) { console.log(event.data); };
|
参考:基于 SptringBoot 实现实时消息推送,这里有7种解决方案!