是否已弃用使用浏览器在Chrome中实时查看EventSource?

去年(大约6月),我在HTML5事件源上写了一个内部操作方法,显示在浏览器中查看Chrome中的事件流数据,实时更新。 输出与此类似:

Event: my-event-name Data: {"my-data"} Event: my-event-name Data: {"my-data"} Event: my-event-name Data: {"my-data"} 

现在,当我在最新版本的Chrome中打开它时,它不再有效(但是读取事件源的应用程序仍然有效)。 即当我浏览到EventSource URL时,我得到一个空白屏幕,没有显示或更新事件信息。

Chrome中似乎已弃用此function。

我能看到的唯一模糊相关的评论就是这个评论 :

通常,请求未完成时不显示内容。

这似乎无法满足EventSource开发人员的需求。

我的问题是: 是否已弃用使用浏览器在Chrome中实时查看EventSource?


编辑:这是一些复制此问题的Java代码。 您设置maven项目并运行Jetty.java ,然后浏览到http:// localhost:8070 /

症状是Chrome会暂停大约十秒钟(大约与循环中的睡眠时间相同),然后在完成后显示内容。 即Chrome正在等待直到流完成,而不是像过去那样实时显示。

这是pom.xml

  4.0.0 com.julian eventsource 0.0.1-SNAPSHOT eventsource   org.mortbay.jetty jetty 4.2.12   javax.servlet servlet-api 2.5    

这是Jetty.java

 package jetty; import java.io.IOException; import java.io.PrintWriter; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.http.SocketListener; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.ServletHttpContext; public class Jetty { public static void main(String[] args) { try { Server server = new Server(); SocketListener listener = new SocketListener(); listener.setHost("localhost"); listener.setPort(8070); listener.setMinThreads(5); listener.setMaxThreads(250); server.addListener(listener); ServletHttpContext context = (ServletHttpContext) server.getContext("/"); context.addServlet("/", "jetty.HelloWorldServlet"); server.start(); server.join(); } catch (Exception ex) { Logger.getLogger(Jetty.class.getName()).log(Level.SEVERE, null, ex); } } } 

这是HelloWorldServlet.java

 package jetty; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { // content type must be set to text/event-stream httpServletResponse.setContentType("text/event-stream"); PrintWriter writer = httpServletResponse.getWriter(); for (int i = 0; i < 10; i++) { writer.write("data: " + System.currentTimeMillis() + "\n\n"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } writer.close(); } } 

不,看起来很好。 我刚刚对Chrome 34上的EventSource站点进行了测试。(并检查它实际上是使用EventSource,而不是其中一个回退。)

不知道关于你的系统的其他任何事情,我的猜测是服务器(或某个中介)现在正在缓冲内容,而不是之前。 有时候,一个非常无辜的配置改变,以次要优化的名义,可以做到这一点。

BTW,无论谁写了“请求未完成时未显示”,可能会让XHR和EventSource感到困惑。 但是,Chrome(即使是Chrome 20,IIRC)也是那些在流式传输时也提供XHR内容的浏览器之一,而不是等待连接关闭,因此他们也必须考虑其他浏览器或其他内容。


更新:看看你的代码,我希望你在writer.write(...)之后需要writer.flush() 。 但是,如果需要,您可能会在所有浏览器中看到相同的问题,而不仅仅是Chrome。 (即你在其他浏览器中看到的问题非常重要。)