java nio 客户端断开连接后报错: ”远程主机强迫关闭了一个现有的连接。“

当客户端直接断开连接时,服务器端会报错如下:

定位到出错的地方

客户端在断开连接时,服务端会触发一个read事件。

但是服务器不知道这个read事件是普通的read,还是代表客户端已经断开连接的read,所以在尝试读取的时候抛出了异常。

为了保持服务端继续运行,我们不能直接抛出异常,而应该捕捉异常并就地处理。

比如这么做:

        SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
        try {
            readBuffer.clear();
            int read = socketChannel.read(readBuffer);
            if(read > 0) {
                readBuffer.flip();
                String receiveData = StandardCharsets.UTF_8.decode(readBuffer).toString();

                System.out.println("收到客户端消息: " + receiveData);

                writeBuffer.clear();
                writeBuffer.put(receiveData.getBytes(StandardCharsets.UTF_8));
                writeBuffer.flip();
                socketChannel.write(writeBuffer);
            }

        }catch (Exception e) {
            try {
                socketChannel.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
            System.out.println("客户端断开了连接~~");
            count--;
        }

完整的代码可以看另一篇博客: java nio简单示例:实现客户端与服务器一问一答   (异常处理,见server端的readHandle方法)

 


版权声明:本文为qq_37855749原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。