第一章Netty,NIO Selector的读事件处理详解
基于前文对 NIO Selector 事件循环、OP_ACCEPT 接入流程及 key.cancel() 清理机制的讨论,读事件(OP_READ)处理是 NIO 服务端接收客户端数据的核心环节。其核心难点在于TCP 流式特性导致的粘包/拆包以及非阻塞 IO 的状态判断。一、核心处理逻辑当 key.isReadable() 为真时,执行以下步骤:获取通道与缓冲区:从 SelectionKey 获取 SocketChannel 及关联的 ByteBuffer(建议使用附件 Attachment 复用缓冲区)。非阻塞读取:调用 channel.read(buffer)。返回值 0:读取到字节数,需处理数据。返回值 == 0:当前无数据,正常现象,跳过。返回值 == -1:客户端正常关闭连接,需清理资源。异常捕获:若读取过程抛出 IOException(如连接重置),需立即取消键并关闭通道。二、完整代码示例(含粘包处理雏形)if(key.isReadable()){SocketChannelclient=(SocketChannel)key.channel();// 使用附件中的缓冲区,避免每次分配内存,同时保留未读完的数据ByteBufferbuffer=(ByteBuffer)key.attachment();try{intbytesRead=client.