NIO阻塞案例講解,為什麼會阻塞和解決辦法

2021-10-01 10:24:38 字數 735 閱讀 6733

public void client() throws ioexception 

//為什麼要使用shutdownoutput呢,如果用close,name整個通道都會關閉,包括網路連線,所以肯定不行,因為接下去還有其他操作

//而wirte還沒有關閉通道一直處於寫入狀態,服務端schannel並不知道結束了,所以還一直等待客戶端的輸出(阻塞)

schannel.shutdownoutput();

//接收服務端的反饋

int len = 0;

while((len = schannel.read(buf)) != -1)

inchannel.close();

schannel.close();

}

public void server() throws ioexception 

//傳送反饋給客戶端

buf.put("服務端接收資料成功".getbytes());

buf.flip();

schannel.write(buf);

schannel.close();

outchannel.close();

sschannel.close();

}

同時啟動這倆程式

主要是客戶端加這個schannel.shutdownoutput(),不然去掉這個會死迴圈,服務端會一直等客戶端傳送資料過來,會死掉

NIO(二) 什麼是阻塞?什麼是非阻塞?

阻塞 當某個事件或者任務在執行過程中,它發出乙個請求操作,但是由於該請求操作需要的條件不滿足,那麼就會一直在那等待,直至條件滿足 非阻塞 當某個事件或者任務在執行過程中,它發出乙個請求操作,如果該請求操作需要的條件不滿足,會立即返回乙個標誌資訊告知條件不滿足,不會一直在那等待。這就是阻塞和非阻塞的區...

NIO非阻塞案例詳細講解,相當於聊天室了

public void client throws ioexception scanner.close socketchannel.close public void server throws ioexception else if sk.isreadable 取消選擇鍵,不然下次還會獲取到 it...

ET為什麼要是非阻塞的

參考 什麼時候會阻塞 讀乙個空的緩衝區的時候,就會產生阻塞。為什麼lt可以使用阻塞和非阻塞,et只能使用非阻塞?是這樣的,lt是對於每個epoll wait返回的讀事件,每次都是讀取一定數量的位元組,然後返回,若沒讀完,等待下一次epoll wait再讀,因此lt的每次讀的時候緩衝區都是非空的 而e...