Java NIO中断开连接后不断有OP_READ事件的问题

今天在学习java nio的时候碰到了一个奇怪的问题,在客户端断开连接后,出现了不断产生新OP_READ事件的问题。

           while(true){
                if(selector.select(1000) == 0){  // 断开连接后这里没有延时的效果
                    System.out.println("==");
                    continue;
                }
                Iterator<SelectionKey> itr = selector.selectedKeys().iterator();
                while (itr.hasNext()){
                    SelectionKey key = itr.next();
                    if(key.isAcceptable()){
                        handleAccept(key);
                    }
                    if(key.isReadable()){ // 断开连接后这里会不断判定为true
                        handleRead(key);
                    }
                    itr.remove();
                }
            }

原因就在于断开连接后,为了让你知道连接已断开,所以会产生OP_READ事件。
那么该怎么判断呢?
其实只要判断一下byteBuffer的大小就可以了,当byteBuffer的长度小于0时,说明连接断开了,那么把channel关闭就可以了。如下:

            long readLength = sc.read(buf);
            if(readLength < 0) sc.close();

参考:https://stackoverflow.com/questions/4139300/socketchannel-fires-isreadable-but-nothing-to-read

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值