
目录
一. 流程分析
(一)流程图
(二)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:读事件 源码跟踪结束
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)