Netty
NIO(Non-Blocking Input/Output)
- 三大组件
- Channel
- Buffer
- Selector
Selector
- Selector可以和一个线程合作,可以理解为Selector是摄像头,可以同时监听多个Channel的I/O状态,然后交由一个线程去处理这些就绪事件
- 你可以把 Selector 想成一个 监控中心(摄像头)。
- 它一直盯着多个 门口(Channel)。
- 一旦某个门口有人按门铃(I/O 就绪),监控中心就通知唯一的值班员(线程)过去处理。
- 相较于传统的IO而言:
- 传统阻塞 I/O:一个连接对应一个线程,线程多了就很浪费(上下文切换,CPU核数不够等)。
- NIO + Selector:一个线程就能处理成千上万个连接的 I/O 事件,大幅减少线程切换和资源占用。
ByteBuffer
- 大致有两个部分:Channel(数据来源/目标)和 Buffer(数据中转区)。
- 初始为写模式,调用 channel.read(buffer) 将数据写入缓冲区。
- 调用 flip() 切换为读模式(limit = position; position = 0)。
- 使用 get() 从缓冲区读取数据。
- 数据读完后,调用 clear() 切回写模式(position = 0; limit = capacity),准备下一轮写入。
- 重复执行,直到通道数据全部读取完毕。
- 如果缓冲区还有未读数据且需要续读,则用 compact() 代替 clear() 保留剩余数据。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Explainfuture's Blog!