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

1.服务器就是在这个bind()里启动完成的

2.Bind()代码,追踪到创建了一个端口对象,并做了一些空判断,核心代码 doBind

public ChannelFuture bind(SocketAddress localAddress){
validate();
if(localAddress=null){
throw new NullPointerException("localAddress");
return doBind(localAddress);
}

3.doBind源码里,核心是两个方法 initAndRegister() 和 doBind0()

private ChannelFuture doBind(final SocketAddress localAddress){
final ChannelFuture regFuture=initAndRegister();
final Channel channel=regFuture.channel();
if (regFuture.cause()!=null){
return regFuture;
}
if(regFuture.isDone()){
// At this point we know that the registration was complete and successful 
ChannelPromise promise = channel.newPromise();
//===============================
//说明:执行 doBind方法,完成对端口的绑定
//===============================
doBind0(regFuture,channel,localAddress,promise);
retum promise;
}else{
//Registration future is almost alwaysfulfilled already,but just in case it's not.
final PendingRegistrationPromise promise=new PendingRegistrationPromise(channel);
regFuture.addListener(new ChannelFutureListener(){
@Override
public void operationComplete(ChannelFuture future)throws Exception{
Throwable cause-future.cause();
if(cause!=null){
//Registration on the EventLoop failed sofail the ChannelPromise directly to not cause an
// IllegalStateException once we try toaccess the EventLoop of the Channel. 
promise.setFailure(cause);
}else{
//Registration was successful,so set the correct executor to use. 
//See https://github.com/netty/netty/issues/2586
promise.registered();
doBind0(regFuture,channel,localAddress,promise);
}
}
});
return promise;
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值