在现代 Web 应用中,实时通讯已经成为了一个必不可少的功能。而基于 Server-Sent Events(SSE)的实时通讯是一种非常简单易用的方式。本文将介绍基于 SSE 的 Java Web 实时通讯,并提供示例代码。
SSE 简介
SSE 是一种基于 HTTP 的实时通讯协议。它允许 Web 服务器向客户端发送事件流,并且客户端可以通过一个简单的 JavaScript API 来接收这些事件。SSE 与 WebSocket 相比,更加轻量级,适用于一些简单的实时通讯场景。
SSE 的事件流是一个由多个事件组成的序列。每个事件都由一个事件标识符、一个事件类型和一个数据字段组成。例如:
id: 1 event: update data: {"message": "Hello, world!"} id: 2 event: update data: {"message": "How are you?"}
客户端可以通过监听 EventSource
对象的 message
事件来接收这些事件。例如:
const eventSource = new EventSource('/event-stream'); eventSource.addEventListener('update', event => { const data = JSON.parse(event.data); console.log(data.message); });
Java Web 中使用 SSE
在 Java Web 中,我们可以使用 Servlet API 来实现 SSE。具体来说,我们需要创建一个继承自 javax.servlet.http.HttpServlet
的 Servlet,并重写 doGet
方法来处理 SSE 的请求。示例代码如下:
// javascriptcn.com 代码示例 @WebServlet("/event-stream") public class EventStreamServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/event-stream"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Cache-Control", "no-cache"); final PrintWriter writer = resp.getWriter(); // 模拟事件流 for (int i = 0; i < 10; i++) { writer.write("id: " + i + "\n"); writer.write("event: update\n"); writer.write("data: {\"message\": \"Hello, world!\"}\n"); writer.write("\n"); writer.flush(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } writer.close(); } }
在上面的代码中,我们首先设置了响应的 Content-Type、字符编码和 Cache-Control 头。然后,我们创建了一个 PrintWriter
对象,用于向客户端输出事件流。最后,我们模拟了一个包含 10 个事件的事件流,并通过 Thread.sleep
方法来模拟事件之间的时间间隔。
客户端的代码同样非常简单,只需要使用 EventSource
对象来监听 /event-stream
URL 即可:
const eventSource = new EventSource('/event-stream'); eventSource.addEventListener('update', event => { const data = JSON.parse(event.data); console.log(data.message); });
总结
本文介绍了基于 SSE 的 Java Web 实时通讯。SSE 是一种非常简单易用的实时通讯协议,适用于一些简单的实时通讯场景。在 Java Web 中,我们可以使用 Servlet API 来实现 SSE,并通过一个简单的 JavaScript API 来接收事件流。希望本文对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650afb3395b1f8cacd548d05