Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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
Javascript 什么是触发SSE错误事件_Javascript_Java_Server Sent Events - Fatal编程技术网

Javascript 什么是触发SSE错误事件

Javascript 什么是触发SSE错误事件,javascript,java,server-sent-events,Javascript,Java,Server Sent Events,我有一个服务SSE数据的servlet writer.write("data: Time is "); writer.write(Calendar.getInstance().getTime().toString()+"\n\n"); System.out.println("Error state of the stream: " + writer.checkError()); //prints false response.flushBuffer(); 下面是我的javascript代码:

我有一个服务SSE数据的servlet

writer.write("data: Time is ");
writer.write(Calendar.getInstance().getTime().toString()+"\n\n");
System.out.println("Error state of the stream: " + writer.checkError()); //prints false
response.flushBuffer();
下面是我的javascript代码:

var eventSource = null;

function start() {
    if (!!window.EventSource) {
        eventSource = new EventSource("SSESyncServlet");
    } else {
        // Result to xhr polling :(
    }

    eventSource.addEventListener('message', function(event) {
        document.getElementById('dataFromServer').innerHTML = event.data;
    });

    eventSource.addEventListener('open', function(e) {
        console.log("connection opened event");
    });

    eventSource.addEventListener('error', function(e) {
        console.log("connection error event");
    });
}
不确定是什么原因造成的,但我在消息事件之后的javascript中得到了错误事件

更新1:

在下面的评论建议我需要使用异步servlet之后,修改了服务器端代码

    final AsyncContext aCtx = request.startAsync();

    final PrintWriter writer = response.getWriter();
    System.out.println("Request Received");

    Runnable runnable = new Runnable() {
        @Override
        public void run() {

            writer.write("data: Time is \n");
            writer.write("data: "+Calendar.getInstance().getTime().toString()+"\n\n");
            System.out.println("Error state of the stream: " + writer.checkError());
            writer.flush();
            aCtx.dispatch();
        }
    };
    Thread t = new Thread(runnable);
    t.start();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
但现在,即使我关闭了客户端的连接。服务器端代码继续运行

服务器一直在打印

Request Received
Error state of the stream: true

无限期。

您是否使用
AsyncContext
获取您的响应及其编写器?否则,刷新后连接将关闭,并触发
错误
event.Wow。因此,在使用SSE时,我们必须使用AsyncContext?首先调用
writer.write(“data:blah”)是否也不需要行尾?即:
writer.write(“数据:blah\n\n”)@RamRaider对此不确定。我认为如果它是一个延续,我们需要附加“\n”,但即使没有“\n”似乎对我也适用。@John您可以不使用它,但它将关闭连接,客户端代码将重新连接(并在这之前抛出一个漂亮的
错误
)。我建议使用AsyncContext。有关更多详细信息,请参阅。是否使用
AsyncContext
获取响应及其编写器?否则,刷新后连接将关闭,并触发
错误
event.Wow。因此,在使用SSE时,我们必须使用AsyncContext?首先调用
writer.write(“data:blah”)是否也不需要行尾?即:
writer.write(“数据:blah\n\n”)@RamRaider对此不确定。我认为如果它是一个延续,我们需要附加“\n”,但即使没有“\n”似乎对我也适用。@John您可以不使用它,但它将关闭连接,客户端代码将重新连接(并在这之前抛出一个漂亮的
错误
)。我建议使用AsyncContext。有关更多详细信息,请参阅。