服务端向客户端推送消息,除了可以用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种解决方案!