1

Java EE サーブレット/jsp では、クライアントは 1 つの http リクエストに対して 1 つの http レスポンスを取得できることがわかっています。http 応答の長さが不明なものを実装したいと考えています。クライアントが最初の http 要求を送信した後、サーバーがクライアントのデータをプッシュし続けることを望みます。その場合、AJAX は非常に重いため、AJAX を使用したくありません。

たとえば、Web サーバーからログ メッセージを取得できる Web ページを作成したい場合、別のモジュールからログ メッセージが生成されたときに、ログ メッセージが Web サーバーによって送信される可能性があります (この場合、時間間隔は不明です。ここでは、通常のタイマー チェックは適切ではないと仮定します)。ログ メッセージは Web ブラウザに追加されます。これは、Web ブラウザが更新できないことを意味します。例:

午後 12:00 のログ ..... 午後 12:03 のログ ..... 午後 12:04 のログ ..... . . .

1 つの http 要求のみを送信し、引き続き http 応答を取得することで、どのようにそれを行うことができますか?


@dystroy

doPost/doGet が終了する前に、printwriter を複数回 (新しいログ データがある場合) フラッシュできるということですか?

構文エラーは無視してください。私はIDEを使用しませんでした。

protected void doPost(HttpServletRequest req, HttpServletResponse resp){

    PrintWriter pw = resp.getWriter();

    pw.println("<html><body>Testing for the streaming.</body></html>");
    pw.flush();


    /*
    The syntax could not be correct, please focus on logic.
    This while loop check the log sent by web server is finised or not and flush the data to the 
    client, after that the javascript will change the content of the inner Html. Is the logic below
    valid?
    */
    while(!log.finish()){
        pw.println("document.setInnerHtml("+log.newLog()+")");
        pw.flush(); 
    }

}
4

2 に答える 2

0

確かに、の使用を検討する必要がありますkeep-alive

これにより、クライアントは既存の接続を再利用して、サーバーからデータを継続的に読み取ることができます。以下に、以下のリンクから例をコピーしました。

try {
    URL a = new URL(args[0]);
    URLConnection urlc = a.openConnection();
    is = conn.getInputStream();
    int ret = 0;
    while ((ret = is.read(buf)) > 0) { // here it try to read response using existing connection.
      processBuf(buf);
    }
    // close the inputstream
    is.close();
} catch (IOException e) {
    try {
        respCode = ((HttpURLConnection)conn).getResponseCode();
        es = ((HttpURLConnection)conn).getErrorStream();
        int ret = 0;
        // read the response body
        while ((ret = es.read(buf)) > 0) {
            processBuf(buf);
        }
        // close the errorstream
        es.close();
    } catch(IOException ex) {
        // deal with the exception
    }
}

上記の手法を使用して、ログファイルをロードします。

これについての良い説明があります:持続的接続


別のオプションは単純です。作成を検討してAjax Requestください。

于 2012-05-02T18:30:18.593 に答える
0

常に長い http 回答を使用して定期的にフラッシュすることができます。少なくともネットワークに短い問題が発生するまでは機能します。HTTP ヘッダーで応答の長さを送信する必要はありません。

正しい解決策は、ajax でプルするか、非常に軽量で高速ですが、すべてのブラウザーでサポートされているわけではない Websockets を使用することです ( http://caniuse.com/websocketsを参照)。

「重い」ajax については、コストは基本的に http クエリ + 回答のコストであることに注意してください。100 ミリ秒未満のレイテンシーを要求しておらず、通常の接続を使用している場合は、ajax がかなり高速であることがわかります (jsp よりもサーブレットを使用することをお勧めします)。ログを重すぎる形式でカプセル化しないでください。

于 2012-05-02T16:17:38.153 に答える