簡體   English   中英

Java Servlet繼續發送消息

[英]Java Servlet keep on sending messages

我正在使用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,它應該停止,但是它會不斷地重新發送消息。 為了證明這一點,我打印了計數器i,以查看這是否正確,並且實際上它打印如下:

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

有人知道我在做什么錯嗎? 我真的被卡住了。 非常感謝你。

通過保持PrintWriter處於打開狀態,可以抽象出服務器已發送事件通道,當新數據到達客戶端時,可以以各種方式將其發送到客戶端。

為了能夠將數據發送到客戶端,寫PrintWriter的操作可能應該與上面的響應邏輯分開(以避免阻塞更好地用於答復新的傳入Web請求的線程)。

建議將PrintWriter通道保留在會話變量中,並使用完全不同的服務來調度和寫出消息,例如,通過在ScheduledExecutorService中為每個用戶/打印作者調度一個Executor,該Executor發送一些消息,然后終止該消息。執行程序,保持PrintWriter打開直到超時。

我發現問題是我沒有正確關閉源事件。 問題在於源事件沒有關閉,因此客戶端一直都在監聽相同的消息。 關閉事件源即可解決問題! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM