2012-03-07 96 views
1

我有一個servlet將字節寫入其輸出流。內容的大小可能很大。我想阻止servlet做任何緩衝。 防止響應緩衝的最佳方法是什麼?我不想在ServletOutputStream上自己調用flush()或close(),因爲我認爲servlet容器應該爲我做這件事。 在這種情況下,如果servlet調用flush()和close()並且httpclient尚未讀取字節,則字節駐留在何處。如何防止servlet緩存響應內容

回答

2

每個servlet容器都提供了HttpServletRequest和HttpServletResponse實現的幕後實現,這意味着您不知道一個容器內的支持impl緩衝寫入,而另一個容器不支持impl。這就是說,緩衝將被限制在一個小的多KB大小(如果它已經完成),所以你可以簡單地將()重複寫到輸出流而不用擔心內存。 impl會將這些字節流式傳輸到網絡連接,通過網絡連接到客戶端,網絡硬件,操作系統和客戶端代碼的作用是緩衝並讀取所有內容。

TCP將自動處理ACK並重新發送任何丟失的數據。

總之,你不需要擔心客戶端「趕上」;只需寫出您的數據,並將客戶端上的所有內容與TCP結合起來就可以處理數據。

+0

謝謝..我仍然想知道刷新後的字節在哪裏被調用..它們在客戶端緩衝嗎? – subodh 2012-03-07 21:02:08

+0

它們被推送到您的操作系統的網絡棧,所以現在您的操作系統的TCP/IP網絡代碼負責確保客戶端接收所有數據(您的發送緩衝區)。您的網絡硬件本身也有緩衝功能,然後在所有這些級別的客戶端緩衝。當我們編寫網絡代碼時,智能網絡協議設計使我們忽略了這一複雜程度。 – 2012-03-07 21:04:55

+0

真棒..所以我想答案是ServletOutputstream上的close()和flush()是確保服務器上沒有緩衝發生所需的全部內容,並且大多數Servlet容器都會關閉併爲您刷新,這樣您甚至不需要需要自己做。非常感謝! – subodh 2012-03-07 21:09:20