我有一個接受來自客戶端的輸入的服務器;它從客戶端讀取文本輸入并以某種方式處理它(每個新連接也分配了一個執行緒)。但是,每當客戶端突然與服務器斷開連接時,我都會從BufferedReader.readLine()呼叫的服務器收到 socketException(connection reset) 。所以基本上這個例外是一個客戶端突然終止的指示。
那么在這種情況下,我可以忽略服務器上發生的例外并簡單地關閉該套接字嗎?我只是想知道,因為在 Java 中“忽略”例外并不常見,但是除了不注意例外之外,我還沒有找到任何其他解決方案。
錯誤:
java.net.SocketException:連接重置
每當我們從輸入流讀取資料時就會發生錯誤:
@Override
public void run() {
try (
Socket sock = socket;
PrintWriter out = new PrintWriter(sock.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
){
String receivedData;
while((receivedData = in.readLine()) != null){
out.println(receivedData);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("Client disconnected: " socket);
}
}
uj5u.com熱心網友回復:
忽略此類錯誤不是一個好主意。但是,如果您真的想這樣做,則可以執行以下操作:
try (
Socket socket = this.socket;
socket.doSomething(); // here do what you want
} catch (SocketException e) { // your error
System.out.println("Connection failed."); // jus tlog it but without throwing error
} catch (IOException e) { // all others errors
e.printStackTrace();
System.out.println("Client disconnected: " socket);
}
最好的方法是針對特定錯誤做一些特定的事情。比如 SocketException 是一個重要的錯誤,當 socket 在你的應用中是一個非常重要的方式時,你應該嘗試把它們找回來。如果您失敗(用戶斷開互聯網連接...),您應該通過警報/彈出視窗或日志將其告知當前用戶。
uj5u.com熱心網友回復:
我讀了你的另一個問題,關于關閉連接的例外,在你的兩個問題中,你都在問忽略它們是否是個好主意:答案是 NOT。第二個問題是我如何處理它們。
那么,你需要了解為什么會觸發這些例外,為此你需要了解TCP連接,我分享給你一些鏈接:
https://support.huawei.com/enterprise/mx/doc/EDOC1100058931/a1faac62/tcp
java.net.SocketException: Socket closed 意味著某些梨關閉了連接,但您的程式正在讀取或寫入程序中...
while((receivedData = in.readLine()) != null){
out.println(receivedData);
out.flush();
}
...這些操作在關閉套接字的那一刻被中斷。出于這個原因,這些函式,readline或者printline,觸發一個例外,應該被處理以關閉觸發例外的套接字,以避免在 CLOSE_WAIT 上留下連接,正如你在這個鏈接中看到的,這可以被認為是你的程式的性能問題:
https://www.ibm.com/docs/en/zos/2.1.0?topic=SSLTBW_2.1.0/com.ibm.zos.v2r1.halu101/constatus.htm
好的,當連接意外丟失 ( java.net.SocketException: Connection reset.)時也會發生同樣的事情。在這種情況下,例外意味著連接被對等方意外關閉,而沒有啟動關閉行程。在這種情況下,遠程點已經消失,您的套接字應該關閉以釋放此套接字使用的所有資源。
如果您不處理這些例外,會發生什么情況:在 SO 釋放它們之前,套接字將無法重用,這可能需要幾分鐘時間,并且在高壓力的情況下會耗盡可用的套接字。
由于這些原因以及更多原因,處理套接字例外很重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/335735.html
上一篇:我從.NET5升級到.NET6,現在從LINQ查詢中獲取SqlNullValueException
下一篇:UDP套接字連接、斷開和重新連接
