这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
专栏里我已经给大家介绍了Netty的启动流程,但是没写完,没写完的原因就是:那天实在太晚了,还有很多东西要写,因此这篇文章就把它补上,我是很喜欢有挑战的一名程序员,因为我知道,只有战胜这些挑战,才能打造出自己的个人品牌,否则别想。
本篇文章依然从服务启动开始解析,解析之前没写完的后半部分。
ServerSocketChannel的初始化
这个ServerSocketChannel被创建出来之后呢,紧接着会初始化,我们看看初始化的操作,代码如下:
这四个属性都是初始化我们的ServerSocketChannel的
我们接着走,然后我们看到ChannelInitializer类有一个方法叫initChannel,那这个方法是做什么的?看到了英文注释,就是说这个方法是把我们的这个想加的这个handler增加到这个pipeline里去,加完之后,就把自己移除掉,我们想添加的就是这个ServerBootstrapAcceptor对象,这个handler是负责对客户端接收链接的初始化操作。
channel的注册
然后,进入到注册阶段
继续跟进
然后走到这个方法,继续跟进。
然后就走到了这个方法,这个判断是判断我们的这个当前线程是不是Nio的线程,很明显不是,当前线程是main线程。
然后,它这里面是把我们的这个注册,封装成一个task,丢到里面去执行。
那我们就得跟进这个execute,它很聪明啊,先把这个任务丢到这个NioEventLoopGroup里面的队列里,紧接着会启动一个线程。
当然,这个线程不一定会启动,它会先判断它的状态,这里是1,1就代表没启动。
如果是没启动,就改成2,然后这个线程就启动了,启动之后,执行队列里面的任务,我们就跳过去。
然后点这个方法进去,你会看到真正干活的方法。
这里就是真正干活的方法了,就涉及到JDK的Nio编程了。
这里就是调用Nio编程,把我们的这个channel注册到NioEventLoop绑定的那个Selector上。
绑定之后,就把我们的这个初始化Handler,给移除掉了。
绑定端口
然后,我们进入了这个方法。
然后,我们看到了还是一个execute,然后我们进方法里面看一下。
我们可以看到这个pipeline有很多的这个Handler,我们只找我们需要关注的。
我们找到这个方法,进去看一下。
这个active还是false,所以走doBind。
在这就bind了,之后呢,我们继续跟进。
走到这里就是active了,所以我们继续跟进,看看它都干了什么。
然后我们走到了这个方法,我们跟进read方法。
然后进入这个read方法。
unsafe.beginRead(),这个方法是做啥的呢,我们继续跟进。
这里是开启一个监听器,如果之前没有监听,则进行监听,然后就结束了,我们的链接准备也就做好了。