Netty源码分析第3章(客户端接入流程)—->第5节: 监听读事件

释放双眼,带上耳机,听听看~!

 

Netty源码分析第三章: 客户端接入流程

 

第五节: 监听读事件

 

我们回到AbstractUnsafe的register0()方法:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1private void register0(ChannelPromise promise) {
2    try {
3        //省略代码
4        //做实际的注册
5        doRegister();
6        neverRegistered = false;
7        registered = true;
8        //触发事件
9        pipeline.invokeHandlerAddedIfNeeded();
10        safeSetSuccess(promise);
11        //触发注册成功事件
12        pipeline.fireChannelRegistered();
13        if (isActive()) {
14            if (firstRegistration) {
15                //传播active事件(4)
16                pipeline.fireChannelActive();
17            } else if (config().isAutoRead()) {
18                beginRead();
19            }
20        }
21    } catch (Throwable t) {
22        //省略代码
23    }
24}
25

doRegister()做完实际的注册之后, 会走到if (isActive())这个判断, 因为这个时候链路已经完成, 所以这里是true, 默认判断条件if (firstRegistration)也为true, 所以这里会走到pipeline.fireChannelActive()这一步

有关pipeline我们会在下一章进行详细分析, 这里我们只需要知道, 最后会流转到AbstractUnsafe的beginRead()方法

跟到beginRead()方法:


1
2
3
4
5
6
7
8
9
10
11
12
1public final void beginRead() {
2    assertEventLoop();
3    if (!isActive()) {
4        return;
5    }
6    try {
7        doBeginRead();
8    } catch (final Exception e) {
9        //代码省略
10    }
11}
12

这块代码同样我们也不陌生, 因为我们分析NioServerSocketChannel也分析过了这一步

我们继续跟到doBeginRead():


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1protected void doBeginRead() throws Exception {
2    //拿到selectionKey
3    final SelectionKey selectionKey = this.selectionKey;
4    if (!selectionKey.isValid()) {
5        return;
6    }
7    readPending = true;
8    //获得感兴趣的事件
9    final int interestOps = selectionKey.interestOps();
10    //判断是不是对任何事件都不监听
11    if ((interestOps & readInterestOp) == 0) {
12        //此条件成立
13        //将之前的accept事件注册, readInterest代表可以读取一个新连接的意思
14        selectionKey.interestOps(interestOps | readInterestOp);
15    }
16}
17

这段代码相信大家会比较熟悉, 因为我们服务端channel注册完之后也走到了这里

因为我们在创建NioSocketChannel的时候初始化的是read事件, selectionKey是channel在注册时候返回的key, 所以selectionKey.interestOps(interestOps | readInterestOp)这一步, 会将当前channel的读事件注册到selector中去

注册完成之后, NioEventLoop就可以轮询当前channel的读事件了

以上就是NioSocketChannel注册监听事件的流程

 

 

第三章总结

    本章学习了有关客户端接入, NioSocketChannel的创建, 注册等相关操作, 并且涉及到了上一小节剖析的eventLoop的相关逻辑, 同学们可以将相关的流程通过debug的方式走一遍以加深印象

 

上一节: NioSocketChannel注册到selector

下一节: pipeline的创建

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 间隔 (Spacing)

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索