2012-07-08 105 views
2

這是我傻不轉儲卡住跟蹤捕獲的同時從socket.accept IOException異常(),並關閉線程做接受...有固定的這個問題,我還是想知道如何處理這種情況時,這個叫barfs。爲什麼java服務器套接字接受失敗?

我的應用程序是一個經典的套接字服務器接受數百個客戶端,有時數千個。接受線程始終在accept()調用中啓動並阻塞。一旦被接受,單獨的線程就會啓動以執行這些工作等等。沒什麼特別的。

問題是,accept()失敗時應該做什麼?這應該立即被視爲永久失敗嗎?我是否應該重試進入接受()一段時間,並試圖通過?最佳做法是什麼?而拋出IOException的原因通常是什麼?

+0

直到你給我們提供了錯誤信息/異常,這纔是真正的問題。 '套接字關閉','超出緩衝區空間'以及'超出文件描述符'這些讓人想起來的候選人,每種情況下都有明顯的解釋:沒有別的。 – EJP 2012-07-08 10:07:26

+0

如果我有堆棧跟蹤,首先不會有任何問題。這就是現實。 – Dima 2012-07-08 10:32:37

+0

另外,我認爲這個問題會延續 - 我懷疑接受失敗,因爲linux盒子裏的文件句柄已經用完了。這會引發另外一個問題 - 我應該關閉服務器還是一直試圖希望操作系統能夠找到一些手柄來接受連接... – Dima 2012-07-08 10:34:43

回答

1
  1. 其客戶的責任重試連接失敗。服務器應該只記錄異常並繼續執行「接受」。一般而言,服務器從不啓動與客戶端的連接。
  2. 引發IOException的原因太多,從防火牆問題到文件句柄耗盡問題。 IOException的消息應該揭示原因。
+1

是的,客戶不斷試圖通過,這不是問題。問題是爲什麼會接受失敗,誰應該解決這個問題 - 軟件?或服務器運行的基礎架構。如果我有堆棧跟蹤,我會知道:)我會知道什麼時候再發生這種情況。我只想知道一般情況下,如果工作'接受者'突然失敗應該做什麼 - 繼續嘗試接受?或者只是宣佈致命故障並呼籲用戶注意? – Dima 2012-07-08 10:00:56

1

我可以想到在accept()調用中拋出IOException的唯一原因是端口正在使用或者主機的網絡配置錯誤。

你可能會稍等一會,然後重試,前提是該系統的管理員會注意到這個問題並解決它。但是,如果在啓動過程中發生這種情況,那麼應用程序會用一個「致命的」錯誤消息來解救出來是一個好主意。

+0

發生了什麼事是服務器套接字運行幾天接受連接沒有問題,然後突然失敗。但是你是對的,當這種情況發生在第一次接受'接受'的時候,這個好主意會造成致命的失敗。謝謝你的提示! – Dima 2012-07-08 09:58:27

+1

@Dima - 「accept」失敗時,異常消息說的是什麼? – 2012-07-08 14:32:56

+0

正如我所提到的那樣,這個異常沒有記錄(這本身就是愚蠢的),系統正在生產中,我現在沒有和訪問它。所以我想知道它在什麼情況下可能會失敗。更有趣的是 - 我如何在開發過程中重現這一點... – Dima 2012-07-08 14:37:39