我正在使用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
有人知道我做错了吗?我真的被卡住了。非常感谢你。
答案 0 :(得分:0)
服务器发送事件 - 通过保持PrintWriter打开来抽象通道,当新数据到达时,可以通过各种方式将其发送到客户端。
为了能够向客户端发送数据,写入PrintWriter应该可能与上面的响应逻辑分开(以避免阻塞最好用于回复新传入Web请求的线程)。 / p>
建议将PrintWriter频道保留在会话变量中,并且有一个完全不同的服务负责调度和写出消息,例如通过在ScheduledExecutorService中为每个用户/打印编写者安排执行者,发送一些消息,然后终止执行程序,保持PrintWriter打开,直到它以某种方式超时。
答案 1 :(得分:0)
我发现问题在于我没有正确关闭源事件。问题是源事件没有关闭,因此客户端一直在监听相同的消息。关闭事件源解决了问题! :)