Java servlet和服务器发送事件

是否可以使用java servlet创建服务器发送事件,以便客户端可以使用以下命令接收更新:

 var source = new EventSource('/events'); source.onmessage = function(e) { document.body.innerHTML += e.data + '
'; };

我在网上找到的所有例子都使用PHP,但我认为它应该使用Java的HTTP Servlet。

这样做的伎俩。

HTML

        

Servlet:

 import java.io.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class sse extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) { try { System.out.println("SSE Demo"); response.setContentType("text/event-stream"); PrintWriter pw = response.getWriter(); int i=0; while(true) { i++; pw.write("event: server-time\n\n"); //take note of the 2 \n 's, also on the next line. pw.write("data: "+ i + "\n\n"); System.out.println("Data Sent!!!"+i); if(i>10) break; } pw.close(); }catch(Exception e){ e.printStackTrace(); } } public void doGet(HttpServletRequest request,HttpServletResponse response) { doPost(request,response); } } 

Server-Sent Events是HTML5function。 我们说“HTML5”,因此它只是客户端function。 这么长的服务器可以设置https respnse标题“text / event-stream; charset = UTF-8”,“Connection”,“keep-alive”,然后服务器支持它。 您可以使用Java Servlet设置此类标头。 在这里,您可以找到有关使用servlet的SSE步骤指南的步骤

我创建了一个非常简单的库,可以在异步模式下集成到普通的Java Servlet中,因此每个客户端都不需要额外的服务器线程: https : //github.com/mariomac/jeasse

它集成了SseDispatcher(用于点对点SSE)和SseBroadcaster(用于事件广播)。 使用示例:

 public class TestServlet extends HttpServlet { SseBroadcaster broadcaster = new SseBroadcaster(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Scanner scanner = new Scanner(req.getInputStream()); StringBuilder sb = new StringBuilder(); while(scanner.hasNextLine()) { sb.append(scanner.nextLine()); } System.out.println("sb = " + sb); broadcaster.broadcast("message",sb.toString()); } //http://cjihrig.com/blog/the-server-side-of-server-sent-events/ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { broadcaster.addListener(req); } }