• 启动配置类Bootstrap 和 ServerBootstrap


    ServerBootStrap是Netty服务端启动配置类,BootStrap是Netty客户端启动配置类。

    一、BootStrap

    //服务器端
    Bootstrap serverBp = new Bootstrap();
    • 绑定线程组,设置react模式的主线程池 以及 IO 操作线程池:group(bossGroup, workerGroup)
    • channel(Class<? extends C> channelClass)

    设置通讯模式,调用的是实现io.netty.channel.Channel接口的类。如:NioSocketChannel、NioServerSocketChannel,客户端一般选NioSocketChannel。

    • option / handler / attr 方法
      • option: 设置通道的选项参数, 对于客户端而言就是SocketChannel;
      • handler: 设置主通道的处理器, 对于客户端的SocketChannel,主要是用来处理 业务操作;
      • attr: 设置通道的属性;

    option / handler / attr方法都定义在AbstractBootstrap中, 所以服务端和客户端的引导类方法调用都是调用的父类的对应方法。

    我们先从一段代码入手:

    EventLoopGroup group = new NioEventLoopGroup();
    try {
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(group)
                .channel(NioSocketChannel.class)
                .option(ChannelOption.SO_KEEPALIVE, true)
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                        //......
                    }
                });
        //发起同步连接操作
        ChannelFuture channelFuture = bootstrap.connect("localhost", 8080).sync();
        channelFuture.channel().closeFuture().sync();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }finally{
        //关闭,释放线程资源
        group.shutdownGracefully();
    }

    1. NioSocketChannel 的创建

    NioSocketChannel 的类层次结构如下:

    在客户端连接代码的初始化 Bootstrap 中调用了一个 channel()方法,传入的参数是 NioSocketChannel.class, 实例化是在 AbstractBootstrap 的 initAndRegister()中,它调用了 ChannelFactory()的 newChannel()来创建一个 NioSocketChannel的实例。

    在实例化一个 Channel 时,必然都要实例化一个 ChannelPipeline。在AbstractChannel 的构造器可以看到 pipeline 字段被初始化为 DefaultChannelPipeline 的实例。

    DefaultChannelPipeline 的构造器需要传入一个 channel,而这个 channel 其实就是我们实例化的 NioSocketChannel,DefaultChannelPipeline 会将这个 NioSocketChannel 对象保存在 channel 字段中。

    DefaultChannelPipeline 中还有两个特殊的字段,即 head 和 tail,这两个字段是双向链表的头和尾。其实在 DefaultChannelPipeline 中,维护了一个以AbstractChannelHandlerContext 为节点元素的双向链表,这个链表是 Netty 实现 Pipeline 机制的关键。

    二、ServerBootStrap

    //服务器端
    ServerBootstrap serverBp = new ServerBootstrap();
    • 绑定线程组,设置react模式的主线程池 以及 IO 操作线程池:group(bossGroup, workerGroup)
    • channel(Class<? extends C> channelClass)

    设置通讯模式,调用的是实现io.netty.channel.Channel接口的类。如:NioSocketChannel、NioServerSocketChannel,服务端一般可以选NioServerSocketChannel。

    • option / handler / attr 方法
      • option: 设置通道的选项参数, 对于服务端而言就是ServerSocketChannel;
      • handler: 设置主通道的处理器, 对于服务端而言就是ServerSocketChannel,也就是用来处理Acceptor的操作;
      • attr: 设置通道的属性;

    option / handler / attr方法都定义在AbstractBootstrap中, 所以服务端和客户端的引导类方法调用都是调用的父类的对应方法。

    • childHandler / childOption / childAttr 方法(只有服务端ServerBootstrap才有child类型的方法)

    对于服务端而言,有两种通道需要处理, 一种是ServerSocketChannel:用于处理用户连接的accept操作, 另一种是SocketChannel,表示对应客户端连接。而对于客户端,一般都只有一种channel,也就是SocketChannel。

    因此以child开头的方法,都定义在ServerBootstrap中,表示处理或配置服务端接收到的对应客户端连接的SocketChannel通道。

  • 相关阅读:
    洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
    牛客练习赛 小D的剑阵 解题报告
    牛客练习赛 小A与最大子段和 解题报告
    牛客练习赛 小D的Lemon 解题报告
    牛客练习赛 小A与任务 解题报告
    洛谷 P1452 Beauty Contest 解题报告
    洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
    【模板】矩阵求逆
    洛谷 P4097 [HEOI2013]Segment 解题报告
    连接数据库的增删改查
  • 原文地址:https://www.cnblogs.com/myitnews/p/12212807.html
Copyright © 2020-2023  润新知