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

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

IV . SelectionKey 简介


SelectionKey 简介 :



① SelectionKey 作用 : SelectorImpl 是 Selector 的实现类 , 在其中可以看到很多 SelectionKey 的 Set 集合 ;


② SelectionKey 集合 : 存储有事件发生的 通道 ( Channel ) 对应的 SelectionKey ;


public abstract class SelectorImpl extends AbstractSelector {
    protected Set<SelectionKey> selectedKeys = new HashSet();
    protected HashSet<SelectionKey> keys = new HashSet();
    private Set<SelectionKey> publicKeys;
    private Set<SelectionKey> publicSelectedKeys;


...



③ 通道 注册给 选择器 : 通道 ( Channel ) 注册到 选择器 ( Selector ) 中 , 每个 通道 ( Channel ) 都有一个对应的 SelectionKey ;


④ 事件触发机制 : 选择器 ( Selector ) 监控到某通道有事件发生 , 就会拿到该通道对应发生的事件的 个数 , 之后处理事件时 , 再去遍历 SelectionKey 集合 , 通过 SelectionKey 可以获取对应的 通道 ( Channel ) , 线程开始为该 通道 ( Channel ) 进行服务 ;


⑤ 通过 SelectionKey 获取 通道 ( Channel ) : 在 SelectionKey 中定义了获取 通道 的方法 , 可以直接获取对应的通道 ;


public abstract SelectableChannel channel()



⑥ 获取触发事件的通道 : 调用 选择器 ( Selector ) 的 select() 方法 , 就可以获得有几个 通道 ( Channel ) 中有事件发生 , 将有事件发生的 通道 的 SelectionKey 放入到集合中 ;


⑦ 触发的事件 : 上述集合中每个 SelectionKey 都代表一个对应 通道 ( Channel ) 的事件 , 如 : 客户端 TCP 连接 , 读取数据 , 写出数据 等事件 ;






V . 选择器 ( Selector ) 工作流程


1 . 创建通道 : 服务器端 , 每当有客户端连接服务器时 , 服务器的 ServerSocketChannel 就会创建一个与客户端对应的 SocketChannel ;



2 . 注册通道 : 将创建的 SocketChannel 注册给 选择器 ( Selector ) , 调用通道的 register() 方法将 通道 ( Channel ) 注册给选择器 ( Selector ) ;



① 注册对应关系 : 一个 选择器 ( Selector ) 可以注册多个 通道 ( Channel ) ;


② 注册返回值 : 通道 注册给 选择器 后 , 会返回 SelectionKey , 此时将 SelectionKey 放入 选择器 ( Selector ) 的集合中进行管理 , 调用 选择器的 keys() 方法 , 可以获取这些注册的 SelectionKey 的 Set 集合 ;


③ 常用的注册方法 : ops 指的是关注的事件 ;


SelectionKey register(Selector sel, int ops)
SelectionKey register(Selector sel, int ops, Object att)


3 . 选择器 ( Selector ) 开始监听 : 调用 select() , select(long timeout) , selectNow() 方法 , 以 阻塞或非阻塞 的方式获取其管理的通道中 , 有几个通道触发了事件 ;



事件的种类 :


OP_READ : 读取数据事件 ;

OP_WRITE : 写出数据事件 ;

OP_CONNECT : 连接操作事件 ;

OP_ACCEPT : 等待连接操作事件 ;


4 . 获取 SelectionKey : 获取有事件发生的 通道 ( Channel ) 的 SelectionKey ;



5 . 获取 SelectionKey 对应的通道 : 调用 SelectionKey 的 channel() 方法 , 可以获取 SelectionKey 对应的 通道 ( Channel ) ;



6 . 通道 ( Channel ) 处理 : 执行真正的业务处理流程 ;


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