JavaServlet继续发送消息
我正在使用HTML5服务器发送事件,我想从服务器向客户端发送随机消息。下面是MessageServlet.java的部分内容: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
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