今天在學(xué)習(xí)java nio的時候碰到了一個奇怪的問題蔑水,在客戶端斷開連接后邢锯,出現(xiàn)了不斷產(chǎn)生新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();
}
}
原因就在于斷開連接后搀别,為了讓你知道連接已斷開丹擎,所以會產(chǎn)生OP_READ事件。
那么該怎么判斷呢歇父?
其實只要判斷一下byteBuffer的大小就可以了蒂培,當(dāng)byteBuffer的長度小于0時,說明連接斷開了榜苫,那么把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