一、java nio selector 选择器理解 https://www.cnblogs.com/snailclimb/p/9086334.html
二、netty reactor 模式理解 https://www.cnblogs.com/crazymakercircle/p/9833847.html
三、netty 源码整体理解 https://www.cnblogs.com/crazymakercircle/p/9853586.html
四、大概总结
java nio selector 为多路选择器,按照事件触发 分四个事件读就绪 写就绪 接受就绪 连接就绪
chinnal 和selector的关系为 多个channel 会注册到selector 上,注册时会指定一种或多种事件,当指定的事件被选择触发时就会在不断循环的 selector.select() 中找到channel 然后执行业务代码
而Reactor 就是把服务端的代码进行一层封装,当有连接时就重新注册一次,读就绪,并设置回调为当前的handler,如果有读的数据就会回调handler的run 方法
明天需要梳理有连接和有数据 是否需要创建新的handler?
五、新的进展理解
假设处理一个TcpConnection连接分为如下步骤,receive - process - send。如果正常处理,要求当前线程必须处理完这么一整个过程才能处理下个连接。而Reactor可以将其拆分成独立的。即处理receive的时候和process和send可以不挂钩。当前线程可以处理完receive,然后将process注册到事件中,然后处理下个连接。
六、netty 中各个名词和经典Reactor 模式对应
Eventloop 对应java nio 中的Reactor 反应器,负责完成channel 的注册、轮询、分发,其内部绑定了java本地的selector 和Thread,轮询的工作就是这个线程干的
Handler 对应Handler ,只不过netty 设计的更加巧妙,使用到了pipeline
Channel 对应 client,也就是netty 中的chinnal 分装了一个java nio 非阻塞类型的channel
七、Reacrot 代码调试后理解
1.handler 是在每次连接就绪后才会生成,生成handler 的同时将handler 作为callback 对象,当有读就绪事件时回调run方法
2.当设置读就绪时方法会阻塞在 selector.select(); 当设置为写就绪时直接进入业务写,写完成之后再设置为读就绪。
3.accepter 相当一种特殊的handler ,当连接就绪时回调其内部run 方法,hander 负责业务读写,各司其职