ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

第一章Netty,NIO Selector的读事件处理详解

2026/8/4 23:47:08 拓冰建站 浏览量
第一章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.