如果对等客户端与服务器断开连接,我们可以忽略服务器端的 socketexception 吗?
If a peer client disconnects from a server could we just ignore the socketexception at the server side?
我有一个接受客户端输入的服务器;它从客户端读取文本输入并以某种方式处理它(每个新连接也被分配一个线程)。但是,每当客户端突然与服务器断开连接时,我都会从调用 BufferedReader.readLine()
的服务器收到 socketException(connection reset) 。所以基本上这个异常是客户端突然终止的一个指标。
所以在这种情况下,我是否可以忽略服务器上发生的异常并关闭该套接字?我只是想知道,因为在 java 中“忽略”异常不是很常见,但是除了不注意异常之外,我还没有找到任何其他解决方案。
错误:
java.net.SocketException: Connection reset
每当我们从输入流读取数据时发生错误:
@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);
}
}
忽略此类错误不是一个好主意。但是如果你真的想这样做,你可以这样做:
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 在你的应用程序中是一个非常重要的方式时,你应该设法让它们回来。如果你失败了(用户断开互联网...)你应该告诉当前用户 alert/popup 或 log.
我读了你的另一个问题,关于关闭连接时的异常,在你的两个问题中你都在问忽略它们是否是个好主意:答案不是 .第二个问题是我是怎么对待他们的。
嗯,你需要了解为什么会触发这些异常,为此,你需要了解 TCP 连接,我分享给你一些 links:
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 上留下连接,如您在中看到的这 link、 可被视为程序的性能问题:
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 释放它们之前,套接字将无法重复使用,这可能需要几分钟时间,并且 运行 在高压力的情况下会耗尽可用的套接字.
出于这些原因以及更多原因,处理套接字异常非常重要。
我有一个接受客户端输入的服务器;它从客户端读取文本输入并以某种方式处理它(每个新连接也被分配一个线程)。但是,每当客户端突然与服务器断开连接时,我都会从调用 BufferedReader.readLine()
的服务器收到 socketException(connection reset) 。所以基本上这个异常是客户端突然终止的一个指标。
所以在这种情况下,我是否可以忽略服务器上发生的异常并关闭该套接字?我只是想知道,因为在 java 中“忽略”异常不是很常见,但是除了不注意异常之外,我还没有找到任何其他解决方案。
错误:
java.net.SocketException: Connection reset
每当我们从输入流读取数据时发生错误:
@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);
}
}
忽略此类错误不是一个好主意。但是如果你真的想这样做,你可以这样做:
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 在你的应用程序中是一个非常重要的方式时,你应该设法让它们回来。如果你失败了(用户断开互联网...)你应该告诉当前用户 alert/popup 或 log.
我读了你的另一个问题,关于关闭连接时的异常,在你的两个问题中你都在问忽略它们是否是个好主意:答案不是 .第二个问题是我是怎么对待他们的。
嗯,你需要了解为什么会触发这些异常,为此,你需要了解 TCP 连接,我分享给你一些 links:
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 上留下连接,如您在中看到的这 link、 可被视为程序的性能问题:
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 释放它们之前,套接字将无法重复使用,这可能需要几分钟时间,并且 运行 在高压力的情况下会耗尽可用的套接字.
出于这些原因以及更多原因,处理套接字异常非常重要。