2010-02-08 137 views
5

我的最後一個項目後,我有問題,客戶端期望從服務器的對象,但在處理客戶端輸入一個異常,強制服務器出於安全原因關閉套接字被捕獲。如何在發現異常後正確關閉套接字?

這會導致客戶端以非常不愉快的方式終止,我決定處理這個問題的方式是在每次接收到輸入後向客戶端發送輸入狀態消息,以便他知道他的輸入是否正確處理或者是否需要拋出異常。

所以我的問題:

  • 有沒有更好/更清潔的方式來關閉套接字的異常被捕獲後?

回答

2

如果我理解正確,你已經關閉了服務器端的套接字,並且你需要你的客戶端來實現這一點,並相應地處理錯誤。

查看Socket文檔,特別是setSoTimeout方法。例如,如果超時設置爲5秒,並且客戶端嘗試從服務器套接字讀取並且他沒有得到答案,則超時將到期並引發一個java.net.SocketTimeoutException,您可以捕獲它並關閉套接字。

您也可以使用ScheduledExecutorServiceTimer來模擬超時。

2

這樣的事情:

  1. 確保把一個try/catch塊內,此套接字代碼。
  2. 關閉'finally'中的套接字。這樣你可以確保你乾淨地關閉套接字,不管是否有例外。
+0

感謝您的回答,我已經這樣做了,問題是如何與客戶溝通他的對象不會來? – woolagaroo 2010-02-08 12:13:14

0

你真的不能因爲套接字被關閉,你可以聽在客戶端上

java.net.SocketException: socket closed 

,然後你就會知道,你失去了與服務器的連接。

+0

不正確,請參閱我的答案。你不能'聽'異常,而且這個異常沒有這個意義。 – EJP 2010-04-06 10:53:23

1

不正確。只有當您嘗試使用您自己關閉的套接字時,纔會發生此異常

OP應該查找的是EOFException或IOException:'連接重置'或SocketTimeoutException。

+0

謝謝,學到了新東西。 – Greg 2010-04-06 21:24:55

相關問題