1、BootStrap介绍
为了方便开发,Netty提供了一系列辅助类,用于把Channel,EventLoop,Handler三个组件快速组装起来完成一个Netty应用,这个系列的类叫做引导类。
- 服务端引导类 ServerBootStrap
- 客户端引导类 BootStrap
BootStrap是Netty提供的一个便利的工厂类,可以通过它来完成Netty客户端或者Netty服务端组件的组装,以及Netty程序的初始化和启动运行。
使用BootStrap类效率更高。
2、BootStrap启动流程
1、创建一个服务端引导类ServerBootstrap serverBootstrap = new ServerBootstrap();
2、为引导类实例设置反应轮询组
也可以不配置两个反应器轮询组,但是会带来风险: 新连接的接收被更加耗时的数据传输或者业务处理阻塞
一般配置两个反应器轮询组,一个负责处理连接监听IO事件,一个负责数据传输事件和处理
NioEventLoopGroup boosLoopGroup = new NioEventLoopGroup();NioEventLoopGroup workerLoopGroup = new NioEventLoopGroup();serverBootstrap.group(boosLoopGroup,workerLoopGroup);
3、设置通道的IO类型
Netty支持多种通道类型serverBootstrap.channel(NioServerSocketChannel.class);
4、设置监听端口serverBootstrap.localAddress(new InetSocketAddress(8989));
5、设置传输通道的配置选项
给父通道设置一些有关传输协议的选项serverBootstrap.option(ChannelOption.SO_KEEPALIVE,true);
6、装配子通道的pipline
每个通道都有一条ChannelPipeline流水线,内部有一个双向链表,装配流水线方式为将业务处理器ChannelHandler实例包装后加入双向链表
serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {super.channelRead(ctx, msg);}});}});
7、绑定服务器新连接的监听端口
通过sync()同步方法阻塞一直到绑定成功ChannelFuture channelFuture = serverBootstrap.bind().sync();log.info("服务器启动成功,监听端口{}",channelFuture.channel().localAddress());
3、BootStrap使用示例
public class BootStrapClient {public static void main(String[] args) throws InterruptedException {Channel channel = new Bootstrap().group(new NioEventLoopGroup()).channel(NioSocketChannel.class).handler(new ChannelInitializer<NioSocketChannel>() {//连接建立后调用@Overrideprotected void initChannel(NioSocketChannel sc) throws Exception {sc.pipeline().addLast(new StringEncoder());}}).connect(new InetSocketAddress("localhost", 8989))//阻塞方法,直至连接建立.sync()//代表连接对象.channel();Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {String str = scanner.next();channel.writeAndFlush(str);}}}
public class BootStrapClient {public static void main(String[] args) throws InterruptedException {Channel channel = new Bootstrap().group(new NioEventLoopGroup()).channel(NioSocketChannel.class).handler(new ChannelInitializer<NioSocketChannel>() {//连接建立后调用@Overrideprotected void initChannel(NioSocketChannel sc) throws Exception {sc.pipeline().addLast(new StringEncoder());}}).connect(new InetSocketAddress("localhost", 8989))//阻塞方法,直至连接建立.sync()//代表连接对象.channel();Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {String str = scanner.next();channel.writeAndFlush(str);}}}
