五Netty源码分析--2ServerBootstrap分析
五Netty源码分析--2ServerBootstrap分析
第二节 ServerBootstrap分析
使用NIO原生类库开发异步服务器时,需要使用多路复用器selector、serverSocketChannel、SocketChannel、selectionKey等,相比于传统BIO开发,NIO开发比较复杂,且稳定性等是个问题。
因此,Netty向使用者屏蔽NIO通信细节,封装了底层细节交给客户,尽量不让用户跟底层API打交道,减少客户的开发量和开发难度,专注于逻辑业务。
(bootsrap使用builder设计模式,因为需要设置的参数太多)
AbstarctBootstrap是netty的配置类和启动辅助类,由于NIO网络编程涉及的参数较多,使用bootstrap可以快捷的启动。
server端和client端的启动代码如下:
//server端
//netty的线程模型,分别用来处理连接请求、IO读写请求的线程组
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
//创建server端启动辅助类
ServerBootstrap b = new ServerBootstrap();
/** …………………………………………………………………………………………server端parentchannel的配置信息…………………………………………………………………………………………………………*/
//参数option设置
b.option(ChannelOption.SO_BACKLOG, 1024);
//配置线程组模型
b.group(bossGroup, workerGroup)
//指定IO的通道模型类(是server端还是client端)
.channel(NioServerSocketChannel.class)
//添加server端的业务逻辑
.handler(new LoggingHandler(LogLevel.INFO))
/** …………………………………………………………………………………………server端childchannel的配置信息…………………………………………………………………………………………………………*/
//添加通过accept接入的client端socketChannel,消息的业务处理逻辑
.childHandler(new ServerInitializer());
//server端bind绑定
Channel ch = b.bind(Config.getInt("server.port")).sync().channel();
ch.closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//优雅关闭资源
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
ServerBootstrap与Bootstrap分别是server端和client端启动配置类。用于绑定netty的线程模型(nioEventLoopGroup)、指定channel类型、channel的option参数、绑定channel的处理器等操作。
注意:
ServerBootstarp启动类的配置选项,分别配置server端父channel和子channel;在Bootstrap中,配置的就是client端的channel。
Bootstrap.bind(UDP)/connect(TCP),创建client端channel,是一个单独且无parentchannel的对象,实现所有的网络交换;
ServerBootstarp.bind,创建的channel作为parentchannel,其管理多个server端的子channel(server端parentchannel.accept创建的就是childchannel),子channel是用于同client端进行通信的对象。