JavaServlet继续发送消息

JavaServlet继续发送消息,java,javascript,html,servlets,Java,Javascript,Html,Servlets,我正在使用HTML5服务器发送事件,我想从服务器向客户端发送随机消息。下面是MessageServlet.java的部分内容: PrintWriter writer = response.getWriter(); Random rnd1 = new Random(); Random rnd2 = new Random(); for(int i = 0; i < 5; i++) { //each message that we end must end with \n\n

我正在使用HTML5服务器发送事件,我想从服务器向客户端发送随机消息。下面是MessageServlet.java的部分内容:

PrintWriter writer = response.getWriter();
Random rnd1 = new Random();
Random rnd2 = new Random();

for(int i = 0; i < 5; i++) {
    //each message that we end must end with \n\n
    writer.flush();
    System.out.println("This is i : " + i);

    if(i == 4) {
        writer.write("event: close \n");
    }
    if(rnd1.nextInt(100) < 30)
        writer.write("data: "+"{\"Messages\":   [{\"Msg\":\"Success1\"}]}"+"\n\n");  
    else
        writer.write("data: "+"{\"Messages\":   [{\"Msg\":\"Success2\"}]}"+"\n\n");

    try {
        Thread.sleep(rnd2.nextInt(3000)); 
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
writer.close();

有人知道我做错了什么吗?我真的卡住了。非常感谢。

服务器发送事件通道是通过保持PrintWriter打开来抽象的,当新数据到达客户端时,可以通过各种方式将其发送到客户端

为了能够向客户机发送数据,向PrintWriter的写入应该与上面的响应逻辑分开(以避免阻塞线程,而线程最好用于响应新的传入web请求)


建议将PrintWriter通道保留在会话变量中,并有一个完全不同的服务负责调度和写出消息,例如,通过在A中为每个用户/PrintWriter调度一个执行器,该执行器发送一些消息,然后终止执行器,保持PrintWriter打开,直到它以某种方式超时。

我发现问题在于我没有正确关闭源事件。问题是源事件没有关闭,因此客户端一直在监听相同的消息。关闭事件源解决了问题!:)

您是否在循环中运行整个代码段?在我看来,for循环正确退出。在发布的代码之外,是否有任何东西可以循环?似乎您的for语句会被反复调用。我认为当您关闭writer时,客户端会重新连接到服务器。当我对此进行研究时,看起来您是对的@claj,但您认为如何解决这个问题?我试图通过发送“close”消息来解决这个问题,这样我就可以在客户端使用addEventListener。但它仍然不起作用:/
THis is i : 0
THis is i : 1
THis is i : 2
THis is i : 3
THis is i : 4
THis is i : 0
THis is i : 1
THis is i : 2
THis is i : 3
THis is i : 4
THis is i : 0
THis is i : 1
THis is i : 2
THis is i : 3
THis is i : 4