现代浏览器已经普遍支持WebSocket和EventSource,可以用它们实现与服务器的实时通信。
WebSocket复杂些,但是双工的;EventSource相对简单且能自动重连,但仅支持服务端推。
WebSocket 配置
Spring boot加入下面的依赖即可使用WebSocket
1 | <dependency> |
WebSocketConfig.class
注册 Websocket Handler & Interceptor
1 |
|
WebSocketInterceptor.class
1 | public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { |
MyWebSocketHandler.class
1 |
|
SseEmitter
Controller方法返回SseEmitter对象即可为客户端提供EventSource
1 | private static Set<SseEmitter> emitters = new HashSet<>(); |
向所有的emitters发送数据text
1 | SseEventBuilder builder = SseEmitter.event().data(text); |
客户端连接
前端js对象WebSocket和EventSource分别用于连接这两种服务。
具体用法略。
Nginx需要的额外配置
EventSource
1 | proxy_http_version 1.1; |
WebSocket
1 | proxy_http_version 1.1; |
已知问题
- 火狐下EventSource中断之后不会自动重连。
- IE系列浏览器都不支持EventSource。