代码拉取完成,页面将自动刷新
NioEventLoopGroup 初始化 ---> MultithreadEventExecutorGroup ---> children = new EventExecutor[] ---> 实现类NioEventLoop
ServerBootstrap.bind() ---> AbstractBootstrap.bind()
---> AbstractBootstrap.doBind()
---> AbstractBootstrap.initAndRegister() 此方法返回一个回调对象,该方法会利用反射进行构造器创建NioServerSocketChannel.java对象
---> ServerBootstrap.init() 此方法会把childGroup交给ServerBootstrap类的内部类ServerBootstrapAcceptor进行处理读写事件,
ServerBootstrapAcceptor类不要想得太过于复杂,这个类就是Server端的handler,重写了channelRead()方法用于把读写事件交给childGroup
---> AbstractBootstrap.doBind0() 如果initAndRegister注册成功则回调此方法
---> bossGroup.eventLoop().execute() 把bind方法构造成一个task交给bossGroup执行器进行执行
这里的eventLoop就是上面的NioEventLoop
NioEventLoop.execute() ---> SingleThreadEventExecutor.execute()
---> SingleThreadEventExecutor.startThread()
---> SingleThreadEventExecutor.doStartThread()
---> NioEventLoop.run()
---> NioEventLoop.processSelectedKey(SelectionKey,AbstractNioChannel)
---> AbstractNioMessageChannel.NioMessageUnsafe.read() 会构建NioSocketChannel的对象,然后用此对象进行处理链流程
此AbstractNioMessageChannel就是NioServerSocketChannel的内部类
---> ServerBootstrapAcceptor.channelRead() 之前也说过ServerBootstrapAcceptor此类主要为了把读写转给childGroup
---> childGroup.register() 此注册流程和bossGroup一致
---> AbstractUnsafe.register()
---> eventLoop.execute() 此eventLoop和上面的不一样 这里的eventLoop是childGroup的NioEventLoop
把注册方法包装成task添加到任务队列,然后开始
---> NioEventLoop.execute() ---> SingleThreadEventExecutor.execute() ...过程一样,忽略
需要注意的是read方法,这里的read调用不是
NioServerSocketChannel,而是上面构建的NioSocketChannel
---> AbstractNioByteChannel.NioByteUnsafe.read() AbstractNioByteChannel就是NioSocketChannel的内部类
---> NioSocketChannel.doReadBytes() 然后就是大家熟悉的nio -> channel.read()
这就是netty设计的比较好的地方 处理链、NioServerSocketChannel、NioSocketChannel等等...
本人渣渣一枚,写的只是自己的理解,如果有问题或者建议,望评论。感谢
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。