前面的学习从12到第16节都是围绕新连接接入的代码来学习,本节做一个总结。
- 检测新连接:netty在
服务端channel
也就是绑定的NioEventLoop
,bossGroup
中轮询到accept事件
- 创建
NioSocketChannel
:轮询到了事件之后,调用jdk的accpet()
方法,获取了一个jdk的客户端channel
,并将之封装厂netty的客户端channel
,即NioSocketChannel
,创建的过程中包括了其中的重要组件unsafe
和pipeline
,unsafe
主要实现channel
的读写,pipeline
负责数据处理的业务逻辑链。 - 分配线程以及注册Selector:服务端channel通过一个连接接入器
ServerBootstrapAcceptor
给当前客户端channel
分配NioEventLoop
,并且将该channel
绑定到唯一的selector
上 - 向selector注册读事件:最后通过传播
channelActive()
方法将客户端channel
的读事件注册到selector
上,至此新链接可正常读写数据。
两个问题
- netty是在哪里检测到有新连接接入的?
boss线程执行的第一个过程,轮询出accpet事件,然后第二个过程通过jdk底层的accept方法,去创建这个连接
- 新连接时怎么注册到NioEventLoop线程的
简单来说,boss线程通过获取chooser的next()方法,拿到一个NioEventLoop。然后将新连接注册到这个NioEventLoop上的selector。
网友评论