// 创建 ServerSocketChannel,绑定端口
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
ServerSocket socket = serverSocketChannel.socket();
InetSocketAddress inetSocketAddress = new InetSocketAddress(PORT);
socket.bind(inetSocketAddress);
// 创建 Selector,注册 ServerSocketChannel 到 Selector,监听 ACCEPT 事件
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
- 执行上述 Java 代码,报如下错误
Exception in thread "main" java.nio.channels.IllegalBlockingModeException
问题描述
-
Selector 要求 Channel 必须处于非阻塞模式,在阻塞模式下将 ServerSocketChannel 注册到 Selector 会报错
-
可以通过 isBlocking 方法来查看 ServerSocketChannel 当前的阻塞模式,该方法会返回一个布尔值,表示通道当前是否处于阻塞模式
-
新创建的 ServerSocketChannel 默认处于阻塞模式,这与传统的 ServerSocket 行为一致
处理策略
- 在注册到 Selector 之前,需要将 Channel 设置为非阻塞模式
serverSocketChannel.configureBlocking(false);