4

サーブレットを使用して単純なサーバー送信イベントの実行中の実装があります。

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
    // TODO Auto-generated method stub

    try
    {
        System.out.println("Server Sent Events");
        response.setContentType("text/event-stream");

        PrintWriter pw = response.getWriter();
        int i=0;
        pw.write("retry: 30000\n"); 
        System.out.println("----------------------");
        while(true)
        {
            i++;

            pw.write("data: "+ i + "\n\n");
            System.out.println("Data Sent : "+i);
            if(i>10)
                break;
        }

    }catch(Exception e){
        e.printStackTrace();
    }
}

そして、私のクライアント側のコードは

<!DOCTYPE html>
<html>
<body onload ="SSE()" >
<script>

    function SSE()
    {
        var source = new EventSource('GetDate');  
        source.onmessage=function(event)
        {
            document.getElementById("result").innerHTML+=event.data + "<br />";
        };
    }
</script>
<output id ="result"></output>

</body>
</html>

しかし、これが実際にどのように機能するかを誰かが説明できますか? サーバーはどのようにして 11 個の整数のチャンクを一度に送信するのでしょうか? また、ここで Printwriter をフラッシュまたは閉じる必要がありますか。サーバーは毎回新しい接続を確立してデータを送信しますか?

4

1 に答える 1

2

レスポンス ストリームは、http パケットのメッセージ ボディにコンテンツを書き込みます。整数をループしていると、それらすべてが次々にコンテンツに追加されます。ストリームでフラッシュ/クローズが閉じられていない限り、ストリームへの書き込みを続けることができ、応答を送信するとすべてが一度に送信されます。

また、フラッシュとクローズについても注意が必要です。スラフする必要はありません。サーブレットコンテナがフラッシュしてクローズします。ところで、クローズはすでに暗黙的にフラッシュを呼び出します。通常、フラッシュの呼び出しは、同じストリームに複数のライターがあり、ライターを切り替えたい場合 (たとえば、バイナリ データと文字データが混在するファイル)、または保持したい場合にのみ有益です。不確かな時間 (ログファイルなど) で開かれるストリーム ポインタ。

于 2013-05-07T06:41:15.247 に答える