Netty的深入浅出--30.Selector源码深入分析

之前几章一直在讲解channel和buffer;

总结来说就是:

读:从channel中获取数据,将数据存储到buffer中,然后对数据进行操作;

写:将数据写入到buffer中,然后通过channel获取buffer数据进行处理。

Netty的深入浅出--30.Selector源码深入分析

接下来我们将讲解selector:

首先讲解一下网络编程

传统的网络编程

服务器这边通过多个独立的线程与多个客户端建立连接,每个客户端对应一个线程。

Netty的深入浅出--30.Selector源码深入分析

 但是这种传统的网络模式,对于并发量小的时候下是可以接受的,但是如果客户端的数量很大的话,每个客户端都需要new一个线程的话,对于操作系统来说,所能够运行的线程是有限的。对于那种几百万的客户端连接的话,这种方式肯定是不现实的。

在这种情况下就需要引入NIO进行异步处理,也就是让一个线程来解决多个客户端请求。题外话,Node是使用异步处理很好的一个语言。后面的章节将会对Node进行详细讲解。

NIO中我们讲了两个组件:channel、buffer。

现在要讲的selector就是要要来解决上面这个问题。

创建项目:

创建了五个监听端口号

Netty的深入浅出--30.Selector源码深入分析

 查看selector源码:

简单来说它是一个多路传输的对象

Netty的深入浅出--30.Selector源码深入分析

通过调用.open()对象创建selector对象,而这个方法本身又是通过SelectorProvider本身来创建selector对象

Netty的深入浅出--30.Selector源码深入分析

我的理解就是:将一个channel通道注册到一个selector中,然后通过selectionKey对象来表示出来。而一个selector中有三组selectionKey。

Netty的深入浅出--30.Selector源码深入分析

 第一组:Key Set先简单的理解就是管理channel的,进行客户端的连接,读写等判断

Netty的深入浅出--30.Selector源码深入分析

第二组:selected-key是key set的子集,简单来说就是我们自己选择的key。

Netty的深入浅出--30.Selector源码深入分析

第三组:cancelled-key也是key set的子集,被取消掉的key

Netty的深入浅出--30.Selector源码深入分析

 对于这三个组件的理解,在这里的英文描述也基本上看不懂什么,大家不要太纠结,继续往下面看

在所有的刚刚创建的selector中,他们三个都是为空的

Netty的深入浅出--30.Selector源码深入分析

简单来描述就是:将一个key加入到selector的key集合中,

Netty的深入浅出--30.Selector源码深入分析

cancelled key

Netty的深入浅出--30.Selector源码深入分析