Java NIO中斷開連接后不斷有OP_READ事件的問(wèn)題

今天在學(xué)習(xí)java nio的時(shí)候碰到了一個(gè)奇怪的問(wèn)題,在客戶端斷開連接后,出現(xiàn)了不斷產(chǎn)生新OP_READ事件的問(wèn)題。

           while(true){
                if(selector.select(1000) == 0){  // 斷開連接后這里沒(méi)有延時(shí)的效果
                    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()){ // 斷開連接后這里會(huì)不斷判定為true
                        handleRead(key);
                    }
                    itr.remove();
                }
            }

原因就在于斷開連接后,為了讓你知道連接已斷開,所以會(huì)產(chǎn)生OP_READ事件。
那么該怎么判斷呢?
其實(shí)只要判斷一下byteBuffer的大小就可以了,當(dāng)byteBuffer的長(zhǎng)度小于0時(shí),說(shuō)明連接斷開了,那么把channel關(guān)閉就可以了。如下:

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 那天我是含著淚看完重慶公交車墜江事故報(bào)道的。我為15個(gè)鮮活的生命在瞬間逝去感到深深地悲痛和惋惜。我在心里一遍又一遍...
    四季悄無(wú)聲閱讀 63評(píng)論 0 0
  • 風(fēng)吹綠了葉,吹落了葉, 一季又一季,一年又一年, 憶起初次相遇, 憶起熟悉的旋律。 你走的那天, 沒(méi)有在意我心里的...
    素絢閱讀 164評(píng)論 6 4
  • 文:櫻子 似炮仗似驚雷 蘊(yùn)藏了一個(gè)冬天的沉默 開始蠢蠢欲動(dòng) 柳枝在臨水梳妝 玉蘭花在古寺旁怒放 風(fēng)信子換上盛裝 風(fēng)...
    雁蕩晨鐘閱讀 734評(píng)論 14 17

友情鏈接更多精彩內(nèi)容