可以看到,Channel被包装为ChannelPromise,它持有Channel和EventLoop。
在上节中介绍了ChannelPipeline,其中常用的方法是addLast(handler)将各类ChannelHandler实例添加到Channel的 ChannelPipeline中。下面我们来看addLast(handler)方法的实现:

最后调用:callHandlerAdded0 方法:
执行刚刚被添加的ChannelHander对象的handlerAdded回调方法。
总结:真正添加到ChannelPipeline中的是ChannelHandlerContext对象,它封装并持有ChannelHandler对象。添加完成后,会调用ChannelHandler的handlerAdded回调方法。
channelInitializer
channelInitizlizer 是一类特殊的ChannelHander,当注册到EventLoop 时候,可以初始化Channel.
在ServerBootStrap绑定端口号的过程中,在initAndRegister方法中:一个ChanneIitizlerlist 被添加到channelPipeline中。
我们来看一下:ChannelInitialize法:
从上述代码可以看到,handlerAdd 方法首先调用InitChnel 方法添加到各种ChannelHander,然后在finally中调用,把当期的ChanneInitializser从ChannelPipeline 中移除,因此ChannelInitilie 可以理解是一次性的。
10. Channel注册到EventLoop
ServeBootStrape 绑定端口时候,很重要的一个方法是initAndRegister,当Channel初始化完成后,会进行注册。。
group 方法返回NioEventLoopGroup,即是bossGroup.
@Override
public EventLoop next() {
return (EventLoop) super.next();
}
@Override
public ChannelFuture register(Channel channel) {
return next().register(channel);
}
进入子类:SingleThreadEventLoop:
@Override
public ChannelFuture register(Channel channel) {
return register(new DefaultChannelPromise(channel, this));
}
@Override
public ChannelFuture register(final ChannelPromise promise) {
ObjectUtil.checkNotNull(promise, "promise");
promise.channel().unsafe().register(this, promise);
return promise;
}
可ch以看到,channel被包装为channel和EventLoop.
最终进入Abstract的register方法:
javachanel()方法返回一个SelecttableChannel对象,然后调用register方法,注册到Selector.
<
本文深入探讨Netty框架的核心机制,包括Channel、EventLoop的工作原理,自定义编解码器的实现,以及如何创建和使用ByteBuf。文章还详细解释了ChannelInitializer的作用,Channel与EventLoop的关系,以及Promise接口的使用。
最低0.47元/天 解锁文章
1974

被折叠的 条评论
为什么被折叠?



