SSE (Server-Sent Events) 是一种 HTML5 的特性,它允许服务器实时向客户端发送数据。SSE 可以用于在 Web 应用程序中推送事件,而不需要客户端轮询服务器获取新的数据。在 Java 中,有多种方式可以实现 SSE 功能,本文将介绍几种常用的 Java 中 SSE 的实现方式及技巧。
基本流程
SSE 最常见的用法就是在服务器端主动给客户端发送信息。整个 SSE 的流程如下:
- 客户端打开 SSE 连接,与服务器建立长连接。
- 服务器端开启 SSE 推送服务,定时向客户端发送数据。
- 客户端在接收到数据时可以调用回调函数进行处理。
服务器端实现方式
Spring WebFlux
在 Spring WebFlux 中,SSE 是通过服务器向客户端推送数据,使用 Server-Sent Events 下的 Flux 类和 ResponseEntity 类即可实现:
-- -------------------- ---- ------- ----------------- - ------- ------ ----------------------------- ----- - ------ ------------------------------------ ------------- -- --------------------------------- ------------------------ ----------------- ------------ --- - - --------- ---------- -
上面的代码每隔一秒钟向客户端推送一次数据(data)并包装成 ServerSentEvent 类型。在客户端接收到信息后,可以根据接收到的信息进行回调处理。
Servlet
在 Servlet 中,可以使用 HttpServletResponse 类中的 writer 对象向客户端发送数据。Servlet 3.1 中对于 SSE 的支持已经非常完善:
-- -------------------- ---- ------- ---------------- - ------------- ----------- - ------- ------ ----- ---------- ------- ----------- - ------- ------ ----- ---- ---------------- - --------------------- --------- --------- ---- ------------------------ -------- ------------------- --------- ------ ----------- - --------------------------------------------- --------------------------------------- ----------- --- - --------------------- --- ---- - - -- - - --- ---- - ---------------- - - ------------------------------ - -------- ------------ --- - ------------------- - ----- --------------------- -- - -------------------- - - - -
上面的代码通过设置 Content-Type 和 CharacterEncoding 头,并循环返回数据,实现了 SSE 功能。
客户端实现方式
客户端可以使用 EventSource 对象接收服务器端的 SSE 推送信息。在 Javascript 中,可以使用 EventSource 对象监听服务器端的 SSE 推送:
var source = new EventSource("/sse"); source.onmessage = function(event) { var data = event.data; console.log(data); // 根据返回数据做出相应处理 }
避免内存泄漏
SSE 在开发中有一个缺点,那就是长时间运行可能会发生内存泄漏。可以通过设置 retry
字段实现 SSE 刷新:
event: keep-alive retry: 10000
在 Spring WebFlux 中,可以通过 Flux 的 disposeAfter 等方法等避免内存泄漏的问题。
总结
SSE 是一种非常便捷的向客户端实时推送数据的方式。在 Java 中,可以通过多种方式轻松实现 SSE 功能。在开发中应该针对具体的应用场景选用相应的实现方式,并加以优化,避免出现内存泄漏等问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ff051095b1f8cacddabbdf