Set<SelectionKey> selectionKeys = selector.selectedKeys();这里没必要删除,也就没必要使用迭代器遍历了,因为for循环都会生成一个新的Set对象。如果是在for循环外声明并初始化Set<SelectionKey> selectionKeys = new HashSet<~>(),并且for循环中使用的是selectionKeys.addAll(selector.selectedKeys()),这样才需要迭代器删除的吧?请各位大佬不吝赐教。
2019-05-19
最赞回答 / 张小喜
最开始没有任何客户端接入时,serverSocketChannel注册的是ACCEPT事件,等待客户端接入;等到有客户端接入后,服务器与客户端建立的socketChannel就要注册READ事件了。而serverSocketChannel还是注册ACCEPT事件,继续等待其他客户端的接入。
2019-05-14
每次select(),都应该使用一个空的SelectionKey集合。否则下次Select()再处理,会引起状态错误。所以 在每次的select()后的循环处理中,将每个Channel就绪信息删除,其实也可以在每次Select()后整体清空SelectionKey集合
2019-05-13