2012-05-02 6 views
1

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

たとえば、Webサーバーからログメッセージを取得できるWebページを作成する場合、ログメッセージが別のモジュールから生成されたときにWebサーバーによってログメッセージが送信される可能性があります(この場合、時間間隔ここでは定期的なタイマーチェックは好ましくないと仮定しています)。ログメッセージはWebブラウザに追加され、Webブラウザはリフレッシュできません。例:

ログ12:00 pm ..... ログ12:03 pm ..... ログ12:04 pm .... 。 。 。

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(); 
    } 

} 

答えて

0

あなたはいつも長いhttp応答を使用して定期的にそれらをフラッシュすることができます。ネットワークに短時間の問題がある限り、少なくとも動作します。 HTTPヘッダーで答えの長さを送ってはいけません。

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

「重量のある」ajaxについては、コストは本質的にhttpクエリ+回答の1つであることに注意してください。 100msよりも短い待ち時間を要求しておらず、通常の接続がある場合、ajaxは適度に高速です(JSPよりもサーブレットを使用する方が望ましい)。あなたのログをあまりにも重いフォーマットにカプセル化しないでください。

+0

こんにちは、私はここにコードを追加することはできません、上記のコードをチェックする手助けできますか?それはあなたが言っているものに似ているかどうか。 –

+0

私はそれをテストしませんでしたが、あなたのコードは正しいようです。あなたはそれを試して問題を抱えていましたか?私がこのアプローチを説明しようとするとうまくいくわけではありませんが、特にネットワークが悪い場合や、長時間書込みをやめた場合は特にそうではありません。 –

+0

私は後で家にいるときに試してみます。ちなみに、別のコメント作成者が提案したように、Connectionを「Keep Alive」に設定する必要があります。 –

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 
    } 
} 

ログファイルをロードするための上記の方法を使用してください。ここで

は、この上の素敵な説明です:Persistent Connection


別のオプションは、Ajax Requestにすることを検討、単純です。

+0

記事ありがとうございます。 サーブレット/ JSPで同じことをどうやって試してみますか?私はどのように私がサーブレット/ JSPでそれを達成できるかに記事をリンクすることができません。私にもっと手がかりを与えることができますか? –

関連する問題