国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Netty引導客戶端和無連接協(xié)議

2018-08-08 10:44 更新

Bootstrap類可以用來引導客戶端和一些無連接協(xié)議,在本節(jié)中,我們將回顧可用的各種方法引導客戶端,引導線程,和可用的管道實現(xiàn)。

客戶端引導方法

下表是 Bootstrap 的常用方法,其中很多是繼承自 AbstractBootstrap。

Table 9.1 Bootstrap methods

名稱描述
group設置 EventLoopGroup 用于處理所有的 Channel 的事件
channel channelFactorychannel() 指定 Channel 的實現(xiàn)類。如果類沒有提供一個默認的構造函數(shù),你可以調(diào)用 channelFactory() 來指定一個工廠類被 bind() 調(diào)用。
localAddress指定應該綁定到本地地址 Channel。如果不提供,將由操作系統(tǒng)創(chuàng)建一個隨機的。或者,您可以使用 bind() 或 connect()指定localAddress
option設置 ChannelOption 應用于 新創(chuàng)建 Channel 的 ChannelConfig。這些選項將被 bind 或 connect 設置在通道,這取決于哪個被首先調(diào)用。這個方法在創(chuàng)建管道后沒有影響。所支持 ChannelOption 取決于使用的管道類型。請參考9.6節(jié)和 ChannelConfig 的 API 文檔 的 Channel 類型使用。
attr這些選項將被 bind 或 connect 設置在通道,這取決于哪個被首先調(diào)用。這個方法在創(chuàng)建管道后沒有影響。請參考9.6節(jié)。
handler設置添加到 ChannelPipeline 中的 ChannelHandler 接收事件通知。
clone創(chuàng)建一個當前 Bootstrap的克隆擁有原來相同的設置。
remoteAddress設置遠程地址。此外,您可以通過 connect() 指定
connect連接到遠端,返回一個 ChannelFuture, 用于通知連接操作完成
bind將通道綁定并返回一個 ChannelFuture,用于通知綁定操作完成后,必須調(diào)用 Channel.connect() 來建立連接。

如何引導客戶端

Bootstrap 類負責創(chuàng)建管道給客戶或應用程序,利用無連接協(xié)議和在調(diào)用 bind() 或 connect() 之后。

下圖展示了如何工作

Figure%209

  1. 當 bind() 調(diào)用時,Bootstrap 將創(chuàng)建一個新的管道, 當 connect() 調(diào)用在 Channel 來建立連接
  2. Bootstrap 將創(chuàng)建一個新的管道, 當 connect() 調(diào)用時
  3. 新的 Channel

Figure 9.2 Bootstrap process

下面演示了引導客戶端,使用的是 NIO TCP 傳輸

Listing 9.1 Bootstrapping a client

EventLoopGroup group = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap(); //1
bootstrap.group(group) //2
    .channel(NioSocketChannel.class) //3
    .handler(new SimpleChannelInboundHandler<ByteBuf>() { //4
        @Override
        protected void channeRead0(
            ChannelHandlerContext channelHandlerContext,
            ByteBuf byteBuf) throws Exception {
                System.out.println("Received data");
                byteBuf.clear();
            }
        });
ChannelFuture future = bootstrap.connect(
    new InetSocketAddress("www.manning.com", 80)); //5
future.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture channelFuture)
        throws Exception {
            if (channelFuture.isSuccess()) {
                System.out.println("Connection established");
            } else {
                System.err.println("Connection attempt failed");
                channelFuture.cause().printStackTrace();
            }
        }
    });
  1. 創(chuàng)建一個新的 Bootstrap 來創(chuàng)建和連接到新的客戶端管道
  2. 指定 EventLoopGroup
  3. 指定 Channel 實現(xiàn)來使用
  4. 設置處理器給 Channel 的事件和數(shù)據(jù)
  5. 連接到遠端主機

注意 Bootstrap 提供了一個“流利”語法——示例中使用的方法(除了connect()) 由 Bootstrap 返回實例本身的引用鏈接他們。

兼容性

Channel 的實現(xiàn)和 EventLoop 的處理過程在 EventLoopGroup 中必須兼容,哪些 Channel 是和 EventLoopGroup 是兼容的可以查看 API 文檔。經(jīng)驗顯示,相兼容的實現(xiàn)一般在同一個包下面,例如使用NioEventLoop,NioEventLoopGroup 和 NioServerSocketChannel 在一起。請注意,這些都是前綴“Nio”,然后不會用這些代替另一個實現(xiàn)和另一個前綴,如“Oio”,也就是說 OioEventLoopGroup 和NioServerSocketChannel 是不相容的。

Channel 和 EventLoopGroup 的 EventLoop 必須相容,例如NioEventLoop、NioEventLoopGroup、NioServerSocketChannel是相容的,但是 OioEventLoopGroup 和 NioServerSocketChannel 是不相容的。從類名可以看出前綴是“Nio”的只能和“Nio”的一起使用。

EventLoop 和 EventLoopGroup

記住,EventLoop 分配給該 Channel 負責處理 Channel 的所有操作。當你執(zhí)行一個方法,該方法返回一個 ChannelFuture ,它將在 分配給 Channel 的 EventLoop 執(zhí)行。

EventLoopGroup 包含許多 EventLoops 和分配一個 EventLoop 通道時注冊。我們將在15章更詳細地討論這個話題。

清單9.2所示的結果,試圖使用一個 Channel 類型與一個 EventLoopGroup 兼容。

Listing 9.2 Bootstrap client with incompatible EventLoopGroup

EventLoopGroup group = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap(); //1
bootstrap.group(group) //2
    .channel(OioSocketChannel.class) //3
    .handler(new SimpleChannelInboundHandler<ByteBuf>() { //4
        @Override
        protected void channelRead0(
            ChannelHandlerContext channelHandlerContext,
                    ByteBuf byteBuf) throws Exception {
                System.out.println("Reveived data");
                byteBuf.clear();
            }
        });
ChannelFuture future = bootstrap.connect(
    new InetSocketAddress("www.manning.com", 80)); //5
future.syncUninterruptibly();
  1. 創(chuàng)建新的 Bootstrap 來創(chuàng)建新的客戶端管道
  2. 注冊 EventLoopGroup 用于獲取 EventLoop
  3. 指定要使用的 Channel 類。通知我們使用 NIO 版本用于 EventLoopGroup , OIO 用于 Channel
  4. 設置處理器用于管道的 I/O 事件和數(shù)據(jù)
  5. 嘗試連接到遠端。當 NioEventLoopGroup 和 OioSocketChannel 不兼容時,會拋出 IllegalStateException 異常

IllegalStateException 顯示如下:

Listing 9.3 IllegalStateException thrown because of invalid configuration

Exception in thread "main" java.lang.IllegalStateException: incompatible event loop
type: io.netty.channel.nio.NioEventLoop
at
io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:5
71)
...

出現(xiàn) IllegalStateException 的其他情況是,在 bind() 或 connect() 調(diào)用前 調(diào)用需要設置參數(shù)的方法調(diào)用失敗時,包括:

  • group()
  • channel() 或 channnelFactory()
  • handler()

handler() 方法尤為重要,因為這些 ChannelPipeline 需要適當配置。 一旦提供了這些參數(shù),應用程序?qū)⒊浞掷?Netty 的能力。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號