Set<SelectionKey> selectionKeys = selector.selectedKeys();這里沒(méi)必要?jiǎng)h除,也就沒(méi)必要使用迭代器遍歷了,因?yàn)閒or循環(huán)都會(huì)生成一個(gè)新的Set對(duì)象。如果是在for循環(huán)外聲明并初始化Set<SelectionKey> selectionKeys = new HashSet<~>(),并且for循環(huán)中使用的是selectionKeys.addAll(selector.selectedKeys()),這樣才需要迭代器刪除的吧?請(qǐng)各位大佬不吝賜教。
2019-05-19
最贊回答 / 張小喜
最開(kāi)始沒(méi)有任何客戶端接入時(shí),serverSocketChannel注冊(cè)的是ACCEPT事件,等待客戶端接入;等到有客戶端接入后,服務(wù)器與客戶端建立的socketChannel就要注冊(cè)READ事件了。而serverSocketChannel還是注冊(cè)ACCEPT事件,繼續(xù)等待其他客戶端的接入。
每次select(),都應(yīng)該使用一個(gè)空的SelectionKey集合。否則下次Select()再處理,會(huì)引起狀態(tài)錯(cuò)誤。所以 在每次的select()后的循環(huán)處理中,將每個(gè)Channel就緒信息刪除,其實(shí)也可以在每次Select()后整體清空SelectionKey集合
2019-05-13