2012-05-02 52 views
1

我們知道在Java EE servlet/jsp中,客戶端可以爲一個http請求獲取一個http響應。我想實現一些具有未知長度的http響應。我希望服務器在客戶端發送第一個http請求後繼續爲客戶端推送數據。在這種情況下,我不想使用AJAX,因爲AJAX非常重。HTTP響應的未知長度

例如,我想創建一個可以從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進行某些操作,或者使用websocket,它非常輕便快速,但不受所有瀏覽器支持(請參閱http://caniuse.com/websockets)。

關於「重量級」ajax,請注意,成本本質上是http查詢+答案之一。如果你沒有要求延遲小於100ms,並且連接正常,你會發現ajax速度相當快(更喜歡使用servlets而不是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

感謝文章。 我該如何在servlet/jsp中嘗試相同的操作?我無法將文章鏈接到如何在servlet/jsp中實現這一點。可以給我更多線索嗎? –