selector.select() 底层做了哪些 ServerSocketChannel的动作
时间: 2023-06-10 17:06:51 浏览: 79
在 Java NIO 中,ServerSocketChannel 是一个用于监听客户端连接的通道,而 Selector 是一个多路复用器,可以同时监听多个通道的事件。当 ServerSocketChannel 对象注册到 Selector 中时,Selector 将会监听其 OP_ACCEPT 事件,当有新的客户端连接请求到达时,Selector 将会触发该事件,程序可以通过 ServerSocketChannel.accept() 方法获取到新的 SocketChannel 对象,然后可以将其注册到 Selector 中,用于后续的通信。
当调用 Selector.select() 方法时,底层会进行以下操作:
1. 首先,Selector 会遍历所有已经注册的通道,获取它们的感兴趣的事件集合,包括 OP_ACCEPT、OP_READ、OP_WRITE 等。
2. 然后,Selector 会阻塞等待,直到有通道的感兴趣的事件就绪或者超时。
3. 当有感兴趣的事件就绪时,Selector 将会返回就绪的通道集合。
4. 程序可以通过遍历就绪的通道集合,获取到每个通道的感兴趣的事件类型,然后根据事件类型进行相应的处理。例如,对于 ServerSocketChannel,如果有 OP_ACCEPT 事件就绪,则说明有新客户端连接请求到达,程序需要调用 accept() 方法获取到新的 SocketChannel 对象,并将其注册到 Selector 中。
5. 最后,程序可以通过 Selector.selectedKeys().clear() 方法清空已经处理过的就绪事件,以便下次重新监听。
阅读全文