簡體   English   中英

捕獲異常后如何正確關閉套接字?

[英]How to properly close a socket after an exception is caught?

在我的上一個項目之后,我遇到了一個問題,即客戶端期望服務器提供對象,但是在處理客戶端時,輸入了一個異常,該異常迫使服務器出於安全原因關閉套接字。

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

所以我的問題是:

  • 捕獲異常后,是否有更好/更清潔的方法來關閉套接字?

對於這樣的事情:

  1. 確保將此套接字代碼放入try / catch塊中。
  2. 最后“關閉”插座。 這樣,無論是否有異常,您都可以確保完全關閉套接字。

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

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

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

不正確 僅當您嘗試使用已關閉的套接字時,才會發生該異常。

OP應該尋找的是EOFException或IOException:“連接重置”或SocketTimeoutException。

由於套接字已關閉,您確實不能,您可以在客戶端上偵聽

java.net.SocketException: socket closed 

然后您會知道您失去了與服務器的連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM