1、BootStrap介绍

为了方便开发,Netty提供了一系列辅助类,用于把Channel,EventLoop,Handler三个组件快速组装起来完成一个Netty应用,这个系列的类叫做引导类。

  • 服务端引导类 ServerBootStrap
  • 客户端引导类 BootStrap

BootStrap是Netty提供的一个便利的工厂类,可以通过它来完成Netty客户端或者Netty服务端组件的组装,以及Netty程序的初始化和启动运行。
使用BootStrap类效率更高。

2、BootStrap启动流程

1、创建一个服务端引导类
ServerBootstrap serverBootstrap = new ServerBootstrap();
2、为引导类实例设置反应轮询组

也可以不配置两个反应器轮询组,但是会带来风险: 新连接的接收被更加耗时的数据传输或者业务处理阻塞

一般配置两个反应器轮询组,一个负责处理连接监听IO事件,一个负责数据传输事件和处理

  1. NioEventLoopGroup boosLoopGroup = new NioEventLoopGroup();
  2. NioEventLoopGroup workerLoopGroup = new NioEventLoopGroup();
  3. 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实例包装后加入双向链表

  1. serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
  2. @Override
  3. protected void initChannel(SocketChannel ch) throws Exception {
  4. ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
  5. @Override
  6. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  7. super.channelRead(ctx, msg);
  8. }
  9. });
  10. }
  11. });

7、绑定服务器新连接的监听端口
通过sync()同步方法阻塞一直到绑定成功
ChannelFuture channelFuture = serverBootstrap.bind().sync();
log.info("服务器启动成功,监听端口{}",channelFuture.channel().localAddress());

3、BootStrap使用示例

  1. public class BootStrapClient {
  2. public static void main(String[] args) throws InterruptedException {
  3. Channel channel = new Bootstrap()
  4. .group(new NioEventLoopGroup())
  5. .channel(NioSocketChannel.class)
  6. .handler(new ChannelInitializer<NioSocketChannel>() {
  7. //连接建立后调用
  8. @Override
  9. protected void initChannel(NioSocketChannel sc) throws Exception {
  10. sc.pipeline().addLast(new StringEncoder());
  11. }
  12. })
  13. .connect(new InetSocketAddress("localhost", 8989))
  14. //阻塞方法,直至连接建立
  15. .sync()
  16. //代表连接对象
  17. .channel();
  18. Scanner scanner = new Scanner(System.in);
  19. while (scanner.hasNext()) {
  20. String str = scanner.next();
  21. channel.writeAndFlush(str);
  22. }
  23. }
  24. }
  1. public class BootStrapClient {
  2. public static void main(String[] args) throws InterruptedException {
  3. Channel channel = new Bootstrap()
  4. .group(new NioEventLoopGroup())
  5. .channel(NioSocketChannel.class)
  6. .handler(new ChannelInitializer<NioSocketChannel>() {
  7. //连接建立后调用
  8. @Override
  9. protected void initChannel(NioSocketChannel sc) throws Exception {
  10. sc.pipeline().addLast(new StringEncoder());
  11. }
  12. })
  13. .connect(new InetSocketAddress("localhost", 8989))
  14. //阻塞方法,直至连接建立
  15. .sync()
  16. //代表连接对象
  17. .channel();
  18. Scanner scanner = new Scanner(System.in);
  19. while (scanner.hasNext()) {
  20. String str = scanner.next();
  21. channel.writeAndFlush(str);
  22. }
  23. }
  24. }