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