引:Netty启动啦!开心脸!但是这又可能是一篇又臭又长由绕的文章,需要点耐心,需要点动手能力。无奈脸!!!
Netty Example
我选择了Netty源码中的EchoServer来作为例子,它在io.netty.example.echo
包下,代码如下所示(忽略细节,专注核心):
1 | public final class EchoServer { |
源码分析
上面的例子的注释已经很清楚了,在启动之前主要就是在配置启动类ServerBootstrap。现在我就下面的启动方法开始深入分析(debug,代码展示会忽略细节):
1 | ChannelFuture f = b.bind(PORT).sync(); |
Bootstrap相关
我们可以看看这个类干了什么:
1 | // step 1 |
Channel相关
创建一个NioServerSocketChannel对象会发生什么:
1 | private static final SelectorProvider DEFAULT_SELECTOR_PROVIDER = SelectorProvider.provider(); |
ChannelPipeline相关
1 | // step 1 DefaultChannelPipeline |
EventLoop相关
1 | // step 1 MultithreadEventLoopGroup |
总结
- 设置启动类参数
- 创建服务端Channel,同时创建ChannelConfig,ChannelId,ChannelPipeline,ChannelHandler,Unsafe等
- 初始化服务端Channel,设置一些attr,option,以及设置子channel的attr,option,给服务端channel添加新channel接入器
- 将Channel注册到Selector,并触发addHandler,register等事件
- 进行端口绑定,并触发active事件,同时注册ACCEPT事件