启动配置类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通道。

 

posted @ 2020-01-19 10:56  codedot  阅读(5022)  评论(0编辑  收藏  举报