Java 是否不推荐使用浏览器在Chrome中实时查看EventSource?
去年6月左右,我写了一篇关于HTML5事件源的内部指南,展示了如何在浏览器中查看Chrome中的事件流数据,并实时更新。输出与此类似:Java 是否不推荐使用浏览器在Chrome中实时查看EventSource?,java,html,google-chrome,server-sent-events,Java,Html,Google Chrome,Server Sent Events,去年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中打开它时,它不再工作,但读取事件源的应用程序仍然工作。ie当我浏览到EventSourc
Event: my-event-name
Data: {"my-data"}
Event: my-event-name
Data: {"my-data"}
Event: my-event-name
Data: {"my-data"}
现在,当我在最新版本的Chrome中打开它时,它不再工作,但读取事件源的应用程序仍然工作。ie当我浏览到EventSource URL时会出现一个空白屏幕,没有显示或更新任何事件信息
这项功能在Chrome中似乎已被弃用
我能看到的唯一模糊相关的评论是:
通常,在请求未完成时不显示内容
这似乎不能满足EventSource开发人员的需求
我的问题是:使用浏览器在Chrome中实时查看EventSource是否已被弃用
编辑:下面是一些复制此问题的Java代码。设置maven项目并运行Jetty.java,然后浏览到http://localhost:8070/
症状是Chrome将暂停约10秒钟,大约与循环中的休眠时间相同,然后在完成时显示内容。ie Chrome正在等待流结束,而不是像过去那样实时显示流
下面是pom.xml
下面是HelloWorldServlet.java
不,看起来不错。我刚刚在Chrome34上测试了一个EventSource站点。并检查它实际上使用的是EventSource,而不是一个回退 由于不了解您的系统的任何其他信息,我猜测服务器或某个中介现在正在缓冲内容,而以前没有。有时,以小优化的名义进行一次非常无辜的配置更改就可以做到这一点 顺便说一句,在请求未完成时编写not Show的人可能会混淆XHR和EventSource。然而,Chrome即使在Chrome 20中,IIRC也是其中一种在传输时也提供XHR内容的浏览器,而不是等待连接关闭,因此他们一定也在考虑另一个浏览器或其他东西
更新:看看你的代码,我想你需要writer.flush在writer.write之后。。。线然而,如果需要的话,你会在所有浏览器中看到同样的问题,而不仅仅是Chrome浏览器。也就是说,您在其他浏览器中看到什么的问题非常重要。谢谢@Darren,我很感谢您的尝试。我添加了一些代码来复制这个问题。Chrome似乎在等待流完成,而不是像以前那样实时显示。另请注意:如果您在JS中关闭事件流,或者它被某些网络或其他错误关闭,Chrome将永远不会显示响应。它在其他浏览器中如何工作?以及Chrome的具体版本。您是否尝试过旧版本或其他操作系统?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.julian</groupId>
<artifactId>eventsource</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eventsource</name>
<dependencies>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>4.2.12</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
</project>
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);
}
}
}
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();
}
}