Netty的深入浅出--30.Selector源码深入分析
之前几章一直在讲解channel和buffer;
总结来说就是:
读:从channel中获取数据,将数据存储到buffer中,然后对数据进行操作;
写:将数据写入到buffer中,然后通过channel获取buffer数据进行处理。
接下来我们将讲解selector:
首先讲解一下网络编程
传统的网络编程
服务器这边通过多个独立的线程与多个客户端建立连接,每个客户端对应一个线程。
但是这种传统的网络模式,对于并发量小的时候下是可以接受的,但是如果客户端的数量很大的话,每个客户端都需要new一个线程的话,对于操作系统来说,所能够运行的线程是有限的。对于那种几百万的客户端连接的话,这种方式肯定是不现实的。
在这种情况下就需要引入NIO进行异步处理,也就是让一个线程来解决多个客户端请求。题外话,Node是使用异步处理很好的一个语言。后面的章节将会对Node进行详细讲解。
NIO中我们讲了两个组件:channel、buffer。
现在要讲的selector就是要要来解决上面这个问题。
创建项目:
创建了五个监听端口号
查看selector源码:
简单来说它是一个多路传输的对象
通过调用.open()对象创建selector对象,而这个方法本身又是通过SelectorProvider本身来创建selector对象
我的理解就是:将一个channel通道注册到一个selector中,然后通过selectionKey对象来表示出来。而一个selector中有三组selectionKey。
第一组:Key Set先简单的理解就是管理channel的,进行客户端的连接,读写等判断
第二组:selected-key是key set的子集,简单来说就是我们自己选择的key。
第三组:cancelled-key也是key set的子集,被取消掉的key
对于这三个组件的理解,在这里的英文描述也基本上看不懂什么,大家不要太纠结,继续往下面看
在所有的刚刚创建的selector中,他们三个都是为空的
简单来描述就是:将一个key加入到selector的key集合中,
cancelled key