Java NIO 开发 IllegalBlockingModeException 异常:在阻塞模式下将 ServerSocketChannel 注册到 Selector 会报错

// 创建 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
问题描述
  1. Selector 要求 Channel 必须处于非阻塞模式,在阻塞模式下将 ServerSocketChannel 注册到 Selector 会报错

  2. 可以通过 isBlocking 方法来查看 ServerSocketChannel 当前的阻塞模式,该方法会返回一个布尔值,表示通道当前是否处于阻塞模式

  3. 新创建的 ServerSocketChannel 默认处于阻塞模式,这与传统的 ServerSocket 行为一致

处理策略
  • 在注册到 Selector 之前,需要将 Channel 设置为非阻塞模式
serverSocketChannel.configureBlocking(false);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值