Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否不推荐使用浏览器在Chrome中实时查看EventSource?_Java_Html_Google Chrome_Server Sent Events - Fatal编程技术网

Java 是否不推荐使用浏览器在Chrome中实时查看EventSource?

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

去年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当我浏览到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();
}
}