2011-08-18 50 views
0

我正在測試一個客戶端服務器應用程序,以瞭解Servlet何時實際接收/寫入數據到客戶端。Servlets什麼時候讀取或寫入實際數據

測試設置有一個客戶端Java程序,它讀取一個文件並將該文件POST到一個Servlet。

只有在客戶端完成將整個文件(4 MB)數據寫入套接字後,服務器纔會開始讀取該數據。同樣,當Servlet使用PrintWriter發送響應時,只有當Servlet中的doPost(...)方法返回時,響應纔會到達客戶端。 Thorought的測試Tomcat的內存並沒有增加... ...

什麼時候Servlet連接/會話建立?爲什麼當客戶端向套接字寫入前幾個字節的數據時,Servlet不會立即讀取數據?

回答

2

這就是它的工作方式。在從客戶端收到整個請求之前,容器不會調用該servlet。以任何其他方式採取這種做法都意味着任何不可預見的後果。對於初學者來說,你必須在所有的servlet中進行手動完成檢查,這會增加不必要的鍋爐代碼。

如果你希望能夠從他們開始接收時刻的HTTP請求作出反應,你將不得不編寫自己的套接字程序,綁定和端口上監聽和處理自己的輸入。

輸出是另一回事。輸出流會緩衝所有的servlet輸出,但您可以隨時在ServletResponse上調用flushBuffer()來強制它發送所有當前緩衝的內容。儘管如此,一旦你開始發送數據給客戶端,響應被認爲是「已提交」。這是因爲HTTP協議要求某些信息以某種順序進入。例如,標題必須首先發送,這意味着一旦你「提交」了響應,服務器應用程序就不能再添加標頭和cookie了。在servlet完成執行後,容器將始終調用flushBuffer()(或ServletOutputStream上的flush())。

相關問題