了解过netty的人都知道netty的启动类是ServerBootstrap,这是socket服务端的启动辅助类。用户可以很方便的通过ServerBootstarp
创建Netty的服务端。附上一张来之《Netty权威指南第二版》的时序图如下:
1、步骤一,创建ServerBootstrap实例,它只有一个无参的构造函数。这是由于在编码Netty的时候使用了一种叫Builder模式,不清楚此模式的可以自行百度。
2、步骤二,设置绑定Reactor线程池,在学习netty时我们知道Reacotor线程是调度线程也就是我们的netty里面的EventLoopGroup。EventLoopGroup它也就EventLoop的数组。EventLoop的职责是处理所有注册到本线程多路复用器Selector
上的Channel,Selector的轮询操作由绑定的EventLoop线程run方法驱动。在一个循环体内执行。EventLoop不仅仅处理网络io事件,用户自定义的Task,定时任务Task也统一由EventLoop处理。所以这样就实现了统一。
3、步骤三,设置并绑定服务端channel,作为Nio的服务端,需要创建ServerSocketChannel.Netty对nio的ServerSocketChannel进一步进行了封装,对应实现的是NioServerSocketChannel.
图中可以看出是实现了ServerSocketChannel。
来看一下channel的方法
大致可以看出使用了反射。
先去校验传入的channelClass是否为null,为null就抛出异常,否则调用channelFactory方法,此方法需要传入一个
ServerBootstrapChannelFactory对象,
看一下channelFactory方法的实现
也就是吧channelFactory赋值给 本类的channelFactory对象。
4、步骤四,在链路建立的时候创建并初始化ChannelPipeline,ChannelPipeline不是Nio服务端所必需的,它本质上就是一个负责处理网络事件的责任链,负责管理和执行ChannelHandler,网络事件以事件流 的形式在ChannelPipeline中流转。由ChannelPipeline根据ChannelHandler的执行策略调度ChannelHandler的执行。
5、步骤五,初始化ChannelPipeline完成之后,添加并设置ChannelHandler,ChannelHandler是Netty提供给用户定制和扩展的关键接口。利用ChannelHandler用户可以完成大多数的功能定制,列如消息解码,心跳,安全认证,TSL/SSL认证,流量控制,流量整形等。也有一些Netty提供好的ChannelHandler供用户使用。如下:
创建和添加ChannelHandler的代码如下:
6、步骤六,绑定并启动监听端口,在绑定绑定监听端口之前会一系列的检测会初始化工作。完成之后,启动监听端口,将ServerSocketChannel注册到Selector上 监听客户端连接。
7、步骤七,Selector轮询。由Reactor线程NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合。
8、步骤八,当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipline的相应方法。最终调用执行ChannelHandler。