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
相关产品推荐
相关产品推荐

