2012-09-02 122 views
1

我想區分服務器連接關閉的客戶端套接字的例外,就好像服務器套接字由於空閒超時而關閉,原因必須在客戶端生成爲空閒超時異常。與連接失敗異常等類似,連接失敗也是如此。請幫我解決這個問題。提前致謝。如何區分服務器套接字連接在客戶端套接字上關閉的異常?

+1

請參閱http://stackoverflow.com/questions/151590/java-how-to-detect-a-remote-side-socket-close&http://stackoverflow.com/questions/155243/why-is- it-impossible-without-attempting-io-to-detect-that-tcp-socket-was-grac – Zaki

回答

1

如果服務器正確地關閉了套接字,那麼在客戶端只有一個可能的異常,而不是客戶端必須捕捉並找出的一系列不同的異常。只有一個EOS指示:read()返回-1,readLine()返回null,readXXX()爲任何其他X引發EOFException。

如果由於網絡故障導致連接中斷,客戶端通過文本「連接重置」來獲得IOException。如果連接保持運行但服務器沒有發送數據,並且客戶端有讀取超時,則客戶端將收到SocketTimeoutException。這些都不意味着服務器已經關閉了連接(儘管服務器可能導致連接重置,我不會在這裏文檔化)。

如果您需要知道服務器爲什麼關閉了套接字,它將不得不通過消息告訴您。

+0

感謝兄弟爲您解答。通過使用哪種方法,我們可以發送消息從服務器到客戶端請讓我沒有... – Rocky

+0

@Rocky您發送任何其他消息相同的方法。你目前如何發送消息? –

+0

我正在使用session.write方法發送數據。在服務器空閒的情況下,conn超時如果我們發送消息給客戶端,那麼超時方法將不會被執行,因爲它們之間會有一些數據流。所以超時方法從第一次開始,並且空閒連接超時從未發生。感謝彼得的幫助和支持 – Rocky

1

最好的方法是讓服務器向您發送一條消息,說明爲什麼它關閉了連接。服務器不會關閉默認情況下閒置的連接。

+0

感謝Peter的回答。請給我提供一個例子或方法來說明如何做到這一點。 – Rocky

+0

你如何做到這一點取決於你的協議。假設你有一個發送消息類型和消息長度的協議,你可以添加一個類型,這意味着DISCONNECTED_DUE_TO_IDLE_TIMEOUT,並在正文中包含一條文本消息。 –

+0

我使用apache mina框架爲服務器客戶端。那麼我應該使用哪種協議。請告訴我如何使用該協議語法。在此先感謝 – Rocky

相關問題