Netty 源码分析_ChannelHandlerContext和ChannelInitializer_(4)写数据

本文深入探讨Netty框架的核心机制,包括Channel、EventLoop的工作原理,自定义编解码器的实现,以及如何创建和使用ByteBuf。文章还详细解释了ChannelInitializer的作用,Channel与EventLoop的关系,以及Promise接口的使用。

 

 

 

可以看到,Channel被包装为ChannelPromise,它持有ChannelEventLoop

在上节中介绍了ChannelPipeline,其中常用的方法是addLast(handler)将各类ChannelHandler实例添加到ChannelChannelPipeline中。下面我们来看addLast(handler)方法的实现:


 

最后调用:callHandlerAdded0 方法:

执行刚刚被添加的ChannelHander对象的handlerAdded回调方法。

总结:真正添加到ChannelPipeline中的是ChannelHandlerContext对象,它封装并持有ChannelHandler对象。添加完成后,会调用ChannelHandlerhandlerAdded回调方法。

 

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.

<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值