Netty核心源码剖析(三)Netty消息入站源码流程分析

Netty核心源码剖析(三)Netty消息入站源码流程分析,第1张

Netty核心源码剖析(三)Netty消息入站源码流程分析

目录

一. 流程分析

(一)流程图

(二)netty模型图

 二. 主要流程源码

(一)分析入口

 (二)处理第一个SelectedKey:连接事件

 (三)处理第二个SelectedKey:读事件


BossGroup 主要负责监听 . workGroup 负责消息处理 . 主要看下 BossGroup 如何将通道交给 workGroup的 , 和如何处理消息读取的 . 即入站 一. 流程分析 (一)流程图

 

(二)netty模型图

 二. 主要流程源码 (一)分析入口

首先保持服务端的运行,接下来如下图:

 

 在如下图处打上断点:(现在程序并未进入断点,因为此时并无事件发生)

 再接下来,用正常模式启动客户端,注意不要用Debug模式。

 运行完客户端后,服务端停在了断点处,如下图:

 

 (二)处理第一个SelectedKey:连接事件

 

 

 进入processSelectedKey方法后,判断readyOps的值是多少,如果是1说明是读事件,执行OP_READ,如果是16说明是连接事件,执行OP_ACCEPT。当前readyOps值是16,说明是连接事件,执行OP_ACCEPT。

接下来执行unsafe.read(),如下图:

 接着往下走,跟踪发布通道读取事件:

 

 

 

 

 展示一下在ChannelPipeline中查找入站的handler的代码:

private AbstractChannelHandlerContext findContextInbound(int mask) {
        AbstractChannelHandlerContext ctx = this;
        do {
            ctx = ctx.next;
        } while ((ctx.executionMask & mask) == 0);
        return ctx;
    }

 

 

 

 

 

 

 

 

 

 

 

 

 以上无限死循环对应以下模型图所标注的红框部分:

 

 

 

 

 

 

 

 

 

 

 

 继续跟进后,我们会发现程序跳进了NettyServer,接着看下图:

 走到这一步,实际上是在处理我们自定义的消息入站的Handler。

这一步走完后,实际上我们处理的第一个SelectedKey:连接事件的所有源码跟踪完毕,接下来,我们来剖析第二个SelectedKey:读事件的源码跟踪。

 (三)处理第二个SelectedKey:读事件

接下来,我们不要破坏之前的跟踪流程,让之前的跟踪流程继续,然后在如下图示位置打上断点,并放行,开始跟踪第二个SelectedKey:读事件:

 取消断点,继续往下跟进:

 

 

 

 

 

 

 

 

 

 

 

注意,这里继续往下跟踪执行时,程序跳到了我们的自定义消息入站Handler:NettyServerHandler中,来执行我们的NettyServerHandler中的channelRead方法,如下图:

 

 我们再继续往下跟踪,可发现目前是由哪个线程组执行的,如下图:

到此为止:处理第二个SelectedKey:读事件 源码跟踪结束

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5719563.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-18
下一篇2022-12-18

发表评论

登录后才能评论

评论列表(0条)

    保存