Netty源码剖析——bind()绑定端口的分析-中(三十一)

分析说明 initAndRegister()

final ChannelFuture initAndRegister(){
Channel channel-null;
try{
关于Channel工厂制作Channel的方法:
说明:channelFactory.newChannel()的作用
通过 ServerBootstrap 的通道工厂反射创建一个NioServerSocketChannel,
具体追踪源码可以得到下面结论

(1)通过 NIO 的SelectorProvider 的 openServerSocketChannel 
方法得到JDK的channel。目的是让Netty包装JDK的channel。
(2)创建了一个唯一的ChannelId,创建了一个 NioMessageUnsafe,
用于操作消息,创建了一个DefaultChannelPipeline管道,
是个双向链表结构,用于过滤所有的进出的消息。
(3)创建了一个 NioServerSocketChannelConfig 对象,
用于对外展示一些配置。
channel=channelFactory.newChannel();/NioServerSocketChannel

关于NioServerSocketChannel初始化
//说明:init 初始化这个 NioServerSocketChannel,
具体追踪源码可以得到如下结论
(1)init 方法,这是个抽象方法(AbstractBootstrap类的),
由 ServerBootstrap 实现(
可以追一下源码//setChannelOptions(channel,options,logger);).
(2)设置NioServerSocketChannel的TCP属性。
(3)由于 LinkedHashMap 是非线程安全的,使用同步进行处理。
(4)对NioServerSocketChannel的ChannelPipeline
添加ChannelInitializer处理器。
(5)可以看出,init 的方法的核心作用在和ChannelPipeline相关。
(6)从 NioServerSocketChannel 的初始化过程中,
我们知道,pipcline是一个双向链表,并且,
他本身就初始化了 head和 tail,这里调用了他的 addLast 方法,
也就是将整个 handler 插入到 tail 的前面,
因为tail永远会在后面,需要做一些系统的固定工作。

init(channel);
}catch (Throwable t){
if (channel != null){
channel.unsafe().closeForcibly();
return new DefaultChannelPromise(channel,GlobalEventExecutor.INSTANCE).setFailure(t);
}


return new DefaultChannelPromise(new FailedChannel(),GlobalEventExecutor.INSTANCE).setFailure(t);

ChannelFuture regFuture=config().group().register(channel);
if(regFuture.cause()!-null){
if(channel.isRegistered(){
channel.close();
}else{
channel.unsafe().closeForcibly();
}
}
retum regFuture;

}

初步总结initAndRegister()
说明:
1)基本说明: initAndRegister()初始化 NioServerSocketChannel 通道并注册各个handler,返回一个future
2)通过 ServerBootstrap 的通道工厂反射创建一个 NioServerSocketChannel。
3)init 初始化这个 NioServerSocketChannel。
4)config().group().register(channel)通过 ServerBootstrap 的 bossGroup 注册 NioServerSocketChannel。
5)最后,返回这个异步执行的占位符即 regFuture。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值