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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 那天我是含着泪看完重庆公交车坠江事故报道的。我为15个鲜活的生命在瞬间逝去感到深深地悲痛和惋惜。我在心里一遍又一遍...
    四季悄无声阅读 49评论 0 0
  • 风吹绿了叶,吹落了叶, 一季又一季,一年又一年, 忆起初次相遇, 忆起熟悉的旋律。 你走的那天, 没有在意我心里的...
    素絢阅读 119评论 6 4
  • 文:樱子 似炮仗似惊雷 蕴藏了一个冬天的沉默 开始蠢蠢欲动 柳枝在临水梳妆 玉兰花在古寺旁怒放 风信子换上盛装 风...
    雁荡晨钟阅读 598评论 14 17