package nl.tudelft.simulation.dsol.jetty.test; import java.io.BufferedReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.AsyncContextState; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.webapp.WebAppContext; import nl.tudelft.simulation.dsol.logger.SimLogger; /** * SSEServer.java.
*
* Copyright (c) 2003-2019 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights * reserved. See for project information * www.simulation.tudelft.nl. The source code and binary code of this software is proprietary information of Delft * University of Technology. * @author Alexander Verbraeck */ public class SSEServer extends AbstractHandler { // @formatter:off /** the html page. */ String[] page = { "", "", "", "", "Server-Side Event Test", "", "", "", "

Server-Side Event Test

", "", "" }; // @formatter:on /** {@inheritDoc} */ @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Declare response encoding and types response.setContentType("text/html; charset=utf-8"); // Declare response status code response.setStatus(HttpServletResponse.SC_OK); // Write back response for (String s : this.page) response.getWriter().println(s); // Inform jetty that this request has now been handled baseRequest.setHandled(true); } /** * @param args String[]; should be empty * @throws Exception on jetty server error */ public static void main(String[] args) throws Exception { HandlerCollection handlerCollection = new HandlerCollection(true); // handlerCollection.addHandler(new SSEServer()); Server server = new Server(8080); server.setHandler(handlerCollection); server.start(); WebAppContext context = new WebAppContext(); handlerCollection.addHandler(context); context.setContextPath("/"); context.setResourceBase("/jetty"); // ServletHolder servletHolder = new ServletHolder(new SSEServlet()); ServletHolder servletHolder = new ServletHolder(new DefaultServlet() { /** {@inheritDoc} */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("GET"); super.doGet(request, response); response.setStatus(HttpServletResponse.SC_OK); response.setContentType("text/event-stream"); response.setCharacterEncoding(StandardCharsets.UTF_8.name()); response.flushBuffer(); AsyncContextState async = (AsyncContextState) request.startAsync(); new Thread() { @Override public void run() { try { for (int i = 0; i < 3; i++) { try { Thread.sleep(3000); } catch (InterruptedException e) { SimLogger.always().error(e); } ServletOutputStream outputStream = async.getResponse().getOutputStream(); if (outputStream.isReady()) { String message = "data: refresh\n\n"; outputStream.write(message.getBytes(StandardCharsets.UTF_8), 0, message.length()); outputStream.flush(); async.getResponse().flushBuffer(); } else { System.out.println("not ready!"); } System.out.println("wrote!"); } } catch (IOException e) { async.complete(); System.err.println(e.getMessage()); } }; }.start(); } /** {@inheritDoc} */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("POST"); BufferedReader reader = request.getReader(); String str = ""; while ((str = reader.readLine()) != null) { System.out.println(str); } reader.close(); // super.doPost(request, response); } }); servletHolder.setAsyncSupported(true); context.addServlet(servletHolder, "/"); context.start(); } }