W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
在所有的例子代碼中,我們在引導過程中通過 handler() 或childHandler() 都只添加了一個 ChannelHandler 實例,對于簡單的程序可能足夠,但是對于復雜的程序則無法滿足需求。例如,某個程序必須支持多個協(xié)議,如 HTTP、WebSocket。若在一個 ChannelHandle r中處理這些協(xié)議將導致一個龐大而復雜的 ChannelHandler。Netty 通過添加多個 ChannelHandler,從而使每個 ChannelHandler 分工明確,結(jié)構(gòu)清晰。
Netty 的一個優(yōu)勢是可以在 ChannelPipeline 中堆疊很多ChannelHandler 并且可以最大程度的重用代碼。如何添加多個ChannelHandler 呢?Netty 提供 ChannelInitializer 抽象類用來初始化 ChannelPipeline 中的 ChannelHandler。ChannelInitializer是一個特殊的 ChannelHandler,通道被注冊到 EventLoop 后就會調(diào)用ChannelInitializer,并允許將 ChannelHandler 添加到CHannelPipeline;完成初始化通道后,這個特殊的 ChannelHandler 初始化器會從 ChannelPipeline 中自動刪除。
聽起來很復雜,其實很簡單,看下面代碼:
Listing 9.6 Bootstrap and using ChannelInitializer
ServerBootstrap bootstrap = new ServerBootstrap();//1
bootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup()) //2
.channel(NioServerSocketChannel.class) //3
.childHandler(new ChannelInitializerImpl()); //4
ChannelFuture future = bootstrap.bind(new InetSocketAddress(8080)); //5
future.sync();
final class ChannelInitializerImpl extends ChannelInitializer<Channel> { //6
@Override
protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline(); //7
pipeline.addLast(new HttpClientCodec());
pipeline.addLast(new HttpObjectAggregator(Integer.MAX_VALUE));
}
}
通過 ChannelInitializer, Netty 允許你添加你程序所需的多個 ChannelHandler 到 ChannelPipeline
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: