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通道。