Netty引導(dǎo)服務(wù)器

2018-08-08 10:45 更新

服務(wù)器的引導(dǎo)共用了客戶端引導(dǎo)的一些邏輯。

引導(dǎo)服務(wù)器的方法

下表顯示了 ServerBootstrap 的方法

Table 9.2 Methods of ServerBootstrap‘

名稱(chēng)描述
group設(shè)置 EventLoopGroup 用于 ServerBootstrap。這個(gè) EventLoopGroup 提供 ServerChannel 的 I/O 并且接收 Channel
channel channelFactorychannel() 指定 Channel 的實(shí)現(xiàn)類(lèi)。如果管道沒(méi)有提供一個(gè)默認(rèn)的構(gòu)造函數(shù),你可以提供一個(gè) ChannelFactory。
localAddress指定 ServerChannel 實(shí)例化的類(lèi)。如果不提供,將由操作系統(tǒng)創(chuàng)建一個(gè)隨機(jī)的?;蛘?您可以使用 bind() 或 connect()指定localAddress
option指定一個(gè) ChannelOption 來(lái)用于新創(chuàng)建的 ServerChannel 的 ChannelConfig 。這些選項(xiàng)將被設(shè)置在管道的 bind() 或 connect(),這取決于誰(shuí)首先被調(diào)用。在此調(diào)用這些方法之后設(shè)置或更改 ChannelOption 是無(wú)效的。所支持 ChannelOption 取決于使用的管道類(lèi)型。請(qǐng)參考9.6節(jié)和 ChannelConfig 的 API 文檔 的 Channel 類(lèi)型使用。
childOption當(dāng)管道已被接受,指定一個(gè) ChannelOption 應(yīng)用于 Channel 的 ChannelConfig。
attr指定 ServerChannel 的屬性。這些屬性可以被 管道的 bind() 設(shè)置。當(dāng)調(diào)用 bind() 之后,修改它們不會(huì)生效。
childAttr應(yīng)用屬性到接收到的管道上。后續(xù)調(diào)用沒(méi)有效果。
handler設(shè)置添加到 ServerChannel 的 ChannelPipeline 中的 ChannelHandler。 具體詳見(jiàn) childHandler() 描述
childHandler設(shè)置添加到接收到的 Channel 的 ChannelPipeline 中的 ChannelHandler。handler() 和 childHandler()之間的區(qū)別是前者是接收和處理ServerChannel,同時(shí) childHandler() 添加處理器用于處理和接收 Channel。后者代表一個(gè)套接字綁定到一個(gè)遠(yuǎn)端。
clone克隆 ServerBootstrap 用于連接到不同的遠(yuǎn)端,通過(guò)設(shè)置相同的原始 ServerBoostrap。
bind綁定 ServerChannel 并且返回一個(gè) ChannelFuture,用于 通知連接操作完成了(結(jié)果可以是成功或者失?。?/td>

如何引導(dǎo)一個(gè)服務(wù)器

ServerBootstrap 中的 childHandler(), childAttr() 和 childOption() 是常用的服務(wù)器應(yīng)用的操作。具體來(lái)說(shuō),ServerChannel實(shí)現(xiàn)負(fù)責(zé)創(chuàng)建子 Channel,它代表接受連接。因此 引導(dǎo) ServerChannel 的 ServerBootstrap ,提供這些方法來(lái)簡(jiǎn)化接收的 Channel 對(duì) ChannelConfig 應(yīng)用設(shè)置的任務(wù)。

圖9.3顯示了 ServerChannel 創(chuàng)建 ServerBootstrap 在 bind(),后者管理大量的子 Channel。

Figure%209

  1. 當(dāng)調(diào)用 bind() 后 ServerBootstrap 將創(chuàng)建一個(gè)新的管道,這個(gè)管道將會(huì)在綁定成功后接收子管道
  2. 接收新連接給每個(gè)子管道
  3. 接收連接的 Channel

Figure 9.3 ServerBootstrap

記住 child* 的方法都是操作在子的 Channel,被 ServerChannel 管理。

清單9.4 ServerBootstrap 時(shí)會(huì)創(chuàng)建一個(gè) NioServerSocketChannel實(shí)例 bind() 。這個(gè) NioServerChannel 負(fù)責(zé)接受新連接和創(chuàng)建NioSocketChannel 實(shí)例。

Listing 9.4 Bootstrapping a server

NioEventLoopGroup group = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap(); //1
bootstrap.group(group) //2
    .channel(NioServerSocketChannel.class) //3
    .childHandler(new SimpleChannelInboundHandler<ByteBuf>() { //4
        @Override
        protected void channelRead0(ChannelHandlerContext ctx,
            ByteBuf byteBuf) throws Exception {
                System.out.println("Reveived data");
                byteBuf.clear();
            }
        }
    );
ChannelFuture future = bootstrap.bind(new InetSocketAddress(8080)); //5
future.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture channelFuture)
        throws Exception {
            if (channelFuture.isSuccess()) {
                System.out.println("Server bound");
            } else {
                System.err.println("Bound attempt failed");
                channelFuture.cause().printStackTrace();
            }
        }
    }
);
  1. 創(chuàng)建要給新的 ServerBootstrap 來(lái)創(chuàng)建新的 SocketChannel 管道并綁定他們
  2. 指定 EventLoopGroup 用于從注冊(cè)的 ServerChannel 中獲取EventLoop 和接收到的管道
  3. 指定要使用的管道類(lèi)
  4. 設(shè)置子處理器用于處理接收的管道的 I/O 和數(shù)據(jù)
  5. 通過(guò)配置引導(dǎo)來(lái)綁定管道


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)