netty 案例,netty4.1 源码分析篇二《ServerBootstrap 配置与绑定启动》
结合上一章节介绍NioEventLoopGroup,本章节继续介绍ServerBootstrap相关代码。
>启动NettyServer的模版代码
ServerBootstrap与Bootstrap
它们都是继承于AbstractBootstrap,分别负责服务端与客户端;
ServerBootstrap,服务端用于接收客户端的连接并为接收连接的用户创建Channel通道
BootStrap,客户端不接收连接,并且是在父通道完成系列操作。
类继承结构图:
ServerBootstrap启动流程源码分析
1、 处理说明
新建NioEventLoopGroup类型的bossGroup和group。bossGroup主要处理服务端接收客户端连接处理,group主要处理读写等I/O事件及任务等;
创建ServerBootstrap,其主要对一些处理进行代理,如bind()等操作,其是其他类的一个简单门面;
channel()方法设置服务端的ServerSocketChannel实现类,本处实现类为NioServerSocketChannel。
option()方法设置Channel的相关选项,具体查看ChannelOption中的定义;
localAddress()设置服务端绑定的本地地址及端口;
handler()设置服务端的对应Channel的Handler;
childHandler()设置子连接的Channel的Handler;
bind()及sync()绑定本地地址并同步返回绑定结果;
2、 bing()调用流程
调用ServerBootstrap.bind():应用调用ServerBootstrap的bind()操作;
调用AbstractBootstrap.bind():调用doBind()对进行bind操作;
调用AbstractBootstrap.initAndRegister():利用ChannelFactory.newChannel()实例化NioServerSocketChannel;
调用ServerBootstrap.init():对NioServerSocketChannel进行初始化,主要操作如设置Channel相关的选项及属性、设置ChannelHandler为ServerBootstrapAcceptor等,ServerBootstrapAcceptor为inbound类型的ChannelHandler,其为ServerBootstrap的内部类,其主要实现ChannelRead()操作,将客户端的连接注册到EventLoopGroup的EventLoop中。
调用NioEventLoop.register():将NioServerSocketChannel注册到bossGroup中。
调用AbstractBootstrap.doBind0:将实际的bind操作以任务的形式添加到bossGroup的EventLoop中。
调用NioServerSocketChannel.bind():在EventLoop中以任务的形式调用此方法进行实际的bind()操作。
源码方法分析
1、doBind()源码分析
>AbstractBootstrap.java | AbstractBootstrap.doBind()
主要流程处理
调用initAndRegister()初始化Channel并将其注册到bossGroup中的NioEventLoop中;
若注册成功,则调用doBind0()进行实际的bind操作;
若还未注册,则创建注册结果的监听器及doBind0()的异步结果,若Channel注册成功,则在结果监听器中进行doBind0()操作,并将bind()异步结果这种为成功;否则将在监听器中设置异步结果为失败;
2、 initAndRegister()源码分析
>AbstractBootstrap.java | AbstractBootstrap.initAndRegister()
主要处理流程
通过ChannelFactory新创建一个Channel;
调用ServerBootstrap的init()方法对Channel进行初始化;
3、init()源码分析
>AbstractBootstrap.java | AbstractBootstrap.init()
主要处理流程
如果设置了Channel选项,则调用setChannelOptions()对Channel进行选项设置;
如果设置了属性,则将对应属性设置为Channel的属性;
设置子Channel的选项及属性;
初始化NioServerSocketChannel的ChannelHandler为ServerBootstrapAcceptor,ServerBootstrapAcceptor为inbound类型的ChannelHandler,其主要功能是将已经接受连接的子Channel注册到workerGroup的NioEventLoop中;
4、 doBind0()源码分析
>AbstractBootstrap.java | AbstractBootstrap.doBind0()
主要处理流程
将NioServerSocketChannel.bind()操作封装为任务,并将任务提交给其对应的EventLoop进行处理;
5、 ServerBootstrapAcceptor源码分析
ServerBootstrapAcceptor为NioServerSocketChannel的 - ChannelHandler,其类型为Inbound类型;
>ServerBootstrapAcceptor.java
ServerBootstrapAcceptor主要实现了以下方法:
channelRead():设置子连接的ChannelHandler、设置子连接的Channel选项,设置子连接的Channel属性,将子连接注册的child对应的EventLoop中(即workerGroup的EventLoop中);
exceptionCaught():若ServerSocketChannel在accept子连接时抛出异常,若ServerSocketChannel的autoRead为true,则设置其为false,即不允许自动接收客户端连接,并延迟1s后再设置其为true,使其允许自动接收客户端连接;
------------
版权声明: 本文为 InfoQ 作者【小傅哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/813eeaf3a6a683f9edfb451a2】。文章转载请联系作者。
评论