You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java NIO服务端无法检测到SelectionKey,连接异常求助

问题原因分析

你的服务端代码存在核心问题:从未调用selector.select()方法。

在Java NIO的Selector模型中,必须通过select()(或其重载方法)让Selector阻塞等待通道就绪事件,否则selector.selectedKeys()会一直返回空集合,服务端永远无法感知到客户端的连接请求(OP_ACCEPT)以及后续的读写事件。

查看你的服务端run()方法循环:

while (!Thread.currentThread().isInterrupted()) {
    Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
    // ... 处理key的逻辑
}

这段代码直接遍历selectedKeys,但没有先触发Selector去检测就绪通道事件,导致循环一直在空转,不会有任何key被选中。

修复方案

在遍历selectedKeys之前添加selector.select()调用,示例:

while (!Thread.currentThread().isInterrupted()) {
    // 阻塞等待就绪事件,直到有事件发生或线程被中断
    selector.select();
    Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
    // ... 后续处理逻辑
}

如果不想让线程长期阻塞,可使用select(long timeout)设置超时时间,比如selector.select(1000),每1秒唤醒一次以处理中断或其他逻辑。

额外检查点:

  • 确认服务端线程已被启动(调用inputReceiver.start()),若仅创建对象未启动线程,服务端不会运行。
  • 客户端用127.0.0.1、服务端用localhost是兼容的,localhost会解析到127.0.0.1,此部分无问题。

内容的提问来源于stack exchange,提问作者Andrew Kor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:05:05