【Netty】NIO 选择器 ( Selector ) 简介(一)

简介: 【Netty】NIO 选择器 ( Selector ) 简介(一)

I . 选择器 ( Selector )


image.png


NIO ( 非阻塞 IO ) 使用单个线程管理多个 通道 ( Channel ) 就是通过 选择器 ( Selector ) 实现的 ;



选择器 ( Selector ) 简介 :



① 注册机制 : 选择器 ( Selector ) 可以注册多个 通道 ( Channel ) , 注册过程是以事件的方式进行注册 , 如果有事件触发 , 那么 选择器 ( Selector ) 就会针对该事件类型进行对应处理 ;


② 注册后的操作 : 通道 注册给 选择器 之后 , 每个线程对应的 选择器 ( Selector ) 才能监控客户端向服务器中对应的 通道 ( Channel ) 写出的数据 ;


③ 轮询机制 : 选择器 ( Selector ) 工作时 , 不停地在轮询其所注册的 通道 ( Channel ) , 处理该 通道 所注册的对应事件 ;


④ 非阻塞机制 : 只有 客户端连接 有数据写入时 , 才会触发事件 , 线程才开始处理该客户端对应的操作 , 如果没有数据写入 , 线程也不会在此阻塞 , 转而处理其它事务 ;






II . 选择器 ( Selector ) 与 NIO 特性


选择器 ( Selector ) 与 NIO 特性 :



① 多路复用 : 选择器 ( Selector ) 又称为 多路复用器 , 为服务器的一个线程管理多个客户端连接 ;


② 轮询机制 : 客户端通过 Socket 向服务器发送数据 , 被 选择器 ( Selector ) 轮询到 , 线程就会开始为该客户端服务 ;


③ 单线程多个连接 : 如果 该客户端 没有发送数据 , 线程不会在此阻塞 , 线程会为其它的客户端服务 , 因此一个线程可以管理与多个客户端的连接 ;


④ 非阻塞 : 服务器端 的线程 不会因为客户端没有发送数据而阻塞 , 因此称为 非阻塞 IO , 该机制提升了线程的 IO 效率 ;


⑤ 优点 : 服务器端单个线程可以非阻塞地并发处理与多个客户端连接的读写操作 , 提高了系统的 可伸缩性 , 性能 ;






III . 选择器 ( Selector ) API 简介


选择器 ( Selector ) 是 NIO 中的三大核心组件之一 ;



下面是 Selector API 相关简介 ;



1 . Selector 抽象类 说明 : Selector 是一个抽象类 , 其中定义了 打开 , 关闭 , 选择 , 键集 ( SelectionKey ) 相关的方法 ;


public abstract class Selector



2 . 打开 关闭 选择器 ( Selector ) 相关方法 :



① Selector open() 方法 : 打开选择器 , 作用是获取一个选择器 ;


② boolean isOpen() 方法 : 判定选择器是否已经打开 ;


③ void close() 方法 : 关闭选择器 ;



3 . 选择 相关方法 : 监听通道事件 , 如果有事件发生 , 返回发生的事件个数 ;



① int select(long timeout) 方法 : 开始监控该 选择器 ( Selector ) 所注册的 通道 ( Channel ) , 如果某个 通道中有 IO 操作触发 , 将 通道 ( Channel ) 对应的 选择键 ( SelectionKey ) 加入到其待处理集合中 ;


long timeout 参数 : 设置的超时时间 ;

② int select() 方法 : 监听通道事件 , 如果有事件发生 , 返回发生的事件个数 , 如果没有事件发生会一直保持阻塞 ;


③ int selectNow() 方法 : 监听通道事件 , 如果有事件发生 , 返回发生的事件个数 , 如果没有事件发生 , 返回 0 ;



4 . 选择操作的阻塞说明 :



① 阻塞 : 选择器 ( Selector ) 的 select() 方法执行的是 阻塞 操作 , 直到其所关联的 通道 ( Channel ) 有一个有事件发生 ;


② 带超时的阻塞 : 选择器 ( Selector ) 的 select(long timeout) 方法 是阻塞 操作 , 但是如果 timeout 毫秒内没有事件发生 , 就解除阻塞 ;


③ 非阻塞 : 选择器 ( Selector ) 的 selectNow() 方法是 非阻塞的操作 , 如果当前没有事件发生 , 立刻返回 , 有事件发生将 SelectionKey 放入集合再返回 , 总之不阻塞 ;



5 . 阻塞 唤醒相关方法 :


Selector wakeup() 方法 : 如果 选择器 ( Selector ) 调用了 select() 方法 或 select(long timeout) 方法 , 当前处于阻塞状态 , 那么就会立刻解除阻塞 ;



6 . 键集 相关方法 :



① Set<SelectionKey> selectedKeys() 方法 : 获取 选择器 ( Selector ) 所有有事件发生的通道的 SelectionKey 集合 , 上面的 select() 方法只能选择一个 ;


② Set<SelectionKey> keys() 方法 : 获取 选择器 ( Selector ) 所注册的有的通道的 SelectionKey ;



目录
相关文章
|
5月前
|
缓存 移动开发 网络协议
Netty基础—5.Netty的使用简介
本文详细介绍了Netty服务端和客户端的启动流程、IO事件处理类及TCP粘包拆包问题。服务端启动通过ServerBootstrap配置线程模型、IO模型等,客户端通过Bootstrap完成连接配置。IO事件处理类关注关键方法如channelRead、channelActive等。针对TCP粘包拆包,分析了其原因与解决策略,包括消息定长、加分割符和带上长度字段等方式,并介绍了多种解码器如LineBasedFrameDecoder、DelimiterBasedFrameDecoder等。最后对比了Netty组件与传统BIO模型的对应关系,以及Java序列化的不足。
|
5月前
|
消息中间件 缓存 网络协议
Netty基础—4.NIO的使用简介
本文详细介绍了Java NIO(New Input/Output)的核心概念与编程模型。首先,讲解了Buffer缓冲区的作用及4个核心概念:capacity、limit、position、mark,并通过Direct模式创建的Buffer示例展示了其高性能特点。接着,分析了Channel通道的概念,说明其与Buffer的关系以及FileChannel在文件读写中的应用,包括顺序写、随机写和多线程安全特性。 随后,对比了BIO(Blocking IO)编程模型的局限性,如线程资源耗尽问题,引出伪异步IO编程的改进方案,但指出其仍存在级联故障风险。进一步探讨了长连接与短连接的区别及其实现代码。
|
11月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
155 1
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
645 0
|
存储 网络协议 Java
【Netty 神奇之旅】Java NIO 基础全解析:从零开始玩转高效网络编程!
【8月更文挑战第24天】本文介绍了Java NIO,一种非阻塞I/O模型,极大提升了Java应用程序在网络通信中的性能。核心组件包括Buffer、Channel、Selector和SocketChannel。通过示例代码展示了如何使用Java NIO进行服务器与客户端通信。此外,还介绍了基于Java NIO的高性能网络框架Netty,以及如何用Netty构建TCP服务器和客户端。熟悉这些技术和概念对于开发高并发网络应用至关重要。
257 0
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
Java中的NIO编程详解
Java中的NIO编程详解
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
Java中的NIO编程详解
Java中的NIO编程详解