如果对等客户端与服务器断开连接,我们可以忽略服务器端的 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();
        }

...这些操作在关闭套接字的瞬间中断。出于这个原因,这些函数 readlineprintline 触发了一个异常,应该处理该异常以关闭触发异常的套接字以避免在 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 释放它们之前,套接字将无法重复使用,这可能需要几分钟时间,并且 运行 在高压力的情况下会耗尽可用的套接字.

出于这些原因以及更多原因,处理套接字异常非常重要。