啟動配置類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通道。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM