2010-06-02 139 views
9

如何檢測到tomcat servlet請求的客戶端已斷開連接?我讀過我應該做一個response.getOutputStream()。print(),然後是一個response.getOutputStream()。flush()並捕獲一個IOException,但有沒有一種方法可以檢測到這一點,而無需編寫任何數據?在tomcat servlet中檢測客戶端斷開連接?

編輯

該servlet發出,這並不一定最終的數據流,但不一定具有流經它的所有數據(它的實時事件流)。我需要實際檢測客戶端何時斷開連接,因爲我必須在那一點做一些清理工作(釋放資源,等等)。如果我有HttpServletRequest可用,如果客戶端斷開,會嘗試從中讀取拋出IOException。

回答

8

有沒有辦法在不寫數據的情況下檢測到這個 ?

不,因爲TCP/IP沒有辦法在沒有寫入任何數據的情況下檢測到它。

別擔心。只需完成請求操作並編寫響應即可。如果客戶端消失了,那會導致一個IOException:連接重置,它將被拋入到servlet容器中。沒有什麼你需要做的。

+2

*「你不需要做任何事情。」* - 你無能爲力。 – 2010-06-03 03:28:51

+0

我編輯了這個問題來澄清。除非我絕對必須,否則我不想向客戶發送虛假數據。 – Seth 2010-06-03 04:20:34

+0

你不會。你會得到一個異常,而容器會處理它。 – EJP 2010-06-03 12:26:47

5

我需要實際檢測何時客戶端斷開,因爲我有一些清理工作,我必須在這一點(資源釋放,etcetera)。

finally塊用於。無論結果如何,它都會被執行。例如。

OutputStream output = null; 
try { 
    output = response.getOutputStream(); 
    // ... 
    output.flush(); 
    // ... 
} finally { 
    // Do your cleanup here. 
} 

如果我有HttpServletRequest的面世,便試圖讀取,如果客戶端斷開連接從拋出IOException?

取決於您如何從中讀取數據,以及服務器內存中已有多少請求主體。如果是正常格式的編碼請求,無論您何時預先撥打getParameter(),它通常都會被完全解析並存儲在服務器內存中。調用getInputStream()根本沒用。相反,最好在響應中進行。

+0

請求主體不在服務器內存中,直到您讀取它爲止(通過使用請求輸入流或使用application/x-www-form-urlencoded在POST中調用getParameter())。請求體可以是任何大小的,服務器不能將它緩存在內存中。 – 2016-01-29 11:07:14

+0

@彼得:我已經消除了歧義。 – BalusC 2016-01-29 11:17:48

1

您是否嘗試刷新響應的緩衝區: response.flushBuffer(); 似乎在客戶端斷開連接時拋出IOException。

+0

它不會拋出,除非它真的有東西發送給客戶端。 – 2017-08-22 05:17:53

相關問題