2013-03-07 73 views
2

對本地主機上運行的客戶端和服務器都使用合成加載,我通過tcpdump和netstat驗證客戶端正在向服務器發送FIN數據包,但連接停留在CLOSE_WAIT中,而請求仍在服務器(我使用排隊線程池的Jetty)。當工作線程在池中可用時,即使連接已經被客戶端關閉,servlet仍然照常處理該請求。檢查HttpServletRequest的連接是否仍然打開?

我想要的是一種方法來測試連接是否已關閉,以防止服務器處理客戶端已超時的請求(我知道我可以在客戶端上設置一個帶有時間戳的http標頭並且只要時鐘同步,請在服務器上檢查它,但我更願意檢查連接以查看它是否仍處於打開狀態)。

正在嘗試做什麼,如果是這樣,怎麼辦?

回答

2

我不這麼認爲。 FIN並不意味着連接中斷。 A發送B一些數據,然後是FIN;那麼A繼續從B中讀取。這個半封閉狀態沒有任何問題。

您的更好選擇是提高服務器吞吐量,以便客戶不必等待那麼久。

+0

因此,您建議如果我希望客戶端超時,並且希望在客戶端超時後跳過服務器上的工作,最佳解決方案是在標頭中添加時間戳(除了提高服務器響應性)? – jonderry 2013-03-07 02:01:34

+0

是的,如果你控制客戶的行爲,這將是一個很好的解決方案。 – irreputable 2013-03-07 02:04:12

+0

但是,由於時鐘可能不同步,因此服務器在收到請求時爲其加上時間戳會更好。我不熟悉碼頭,不知道該怎麼做。 – irreputable 2013-03-07 02:05:43

相關問題