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方法)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值