
基于前文对 NIO Selector 事件循环、OP_READ 读取逻辑及 key.cancel() 清理机制的深入讨论,处理客户端断开连接的核心在于准确感知断开信号并执行完整的资源清理,以防止内存泄漏和 CPU 空转。一、断开信号的两种形式正常断开:调用 channel.read(buffer) 返回 -1。这表示客户端已发送 FIN 包,连接正常关闭。异常断开:调用 read() 或 write() 时抛出 IOException(如 Connection reset by peer)。这通常由客户端崩溃、网络中断或非正常关闭引起。二、标准处理流程(清理三部曲)无论何种断开,必须严格按顺序执行以下操作:取消注册 (key.cancel()):告诉 Selector 停止监控该通道。若省略此步,Selector 可能持续报告该键就绪,导致死循环和 CPU 100%。关闭通道 (channel.close()):释放底层 Socket 文件描述符。仅 cancel 不 close 会导致资源泄漏。移除迭代项 (iterator.remove()):从当前 selectedKeys 集合中移除,防止本次循环重复处理无效键。三、代码实现示例IteratorSelectionKeyiterator=selector.selectedKeys().iterator();while(iterator.hasNext()){