Java Servlet继续发送消息

时间:2014-08-11 08:56:35

标签: java javascript html5 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
    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();

一旦循环达到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
THis is i : 0
THis is i : 1
THis is i : 2
THis is i : 3
THis is i : 4

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

2 个答案:

答案 0 :(得分:0)

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

为了能够向客户端发送数据,写入PrintWriter应该可能与上面的响应逻辑分开(以避免阻塞最好用于回复新传入Web请求的线程)。 / p>

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

答案 1 :(得分:0)

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