Netty 源码解析(九): connect 过程和 bind 过程分析
原创申明:本文由公众号【猿灯塔】原创,转载请说明出处标注
connect 过程和 bind 过程分析
connect 过程分析
privateChannelFuturedoResolveAndConnect(finalSocketAddressremoteAddress,finalSocketAddresslocalAddress){
//这里完成了register操作
finalChannelFutureregFuture=initAndRegister();
finalChannelchannel=regFuture.channel();
//这里我们不去纠结register操作是否isDone()
if(regFuture.isDone()){
if(!regFuture.isSuccess()){
returnregFuture;
}
//看这里
returndoResolveAndConnect0(channel,remoteAddress,localAddress,channel.newPromise());
}else{
....
}
}
@Override
publicChannelFutureconnect(SocketAddressremoteAddress,ChannelPromisepromise){
returnpipeline.connect(remoteAddress,promise);
}
前面我们介绍的 register 操作是 Inbound 的,是从 head 开始的
@Override
publicfinalChannelFutureconnect(SocketAddressremoteAddress,ChannelPromisepromise){
returntail.connect(remoteAddress,promise);
}
//HeadContext
publicvoidconnect(
ChannelHandlerContextctx,
SocketAddressremoteAddress,SocketAddresslocalAddress,
ChannelPromisepromise)throwsException{
unsafe.connect(remoteAddress,localAddress,promise);
}
//AbstractNioChannel.AbstractNioUnsafe
@Override
publicfinalvoidconnect(
finalSocketAddressremoteAddress,finalSocketAddresslocalAddress,finalChannelPromisepromise){
...... booleanwasActive=isActive();
//大家自己点进去看doConnect方法
//这一步会做JDK底层的SocketChannelconnect,然后设置interestOps为SelectionKey.OP_CONNECT
//返回值代表是否已经连接成功
if(doConnect(remoteAddress,localAddress)){
//处理连接成功的情况
fulfillConnectPromise(promise,wasActive);
}else{
connectPromise=promise;
requestedRemoteAddress=remoteAddress;
//下面这块代码,在处理连接超时的情况,代码很简单
//这里用到了NioEventLoop的定时任务的功能,这个我们之前一直都没有介绍过,因为我觉得也不太重要
intconnectTimeoutMillis=config().getConnectTimeoutMillis();
if(connectTimeoutMillis>0){
connectTimeoutFuture=eventLoop().schedule(newRunnable(){
@Override
publicvoidrun(){
ChannelPromiseconnectPromise=AbstractNioChannel.this.connectPromise;
ConnectTimeoutExceptioncause=
newConnectTimeoutException("connectiontimedout:"+remoteAddress);
if(connectPromise!=null&&connectPromise.tryFailure(cause)){
close(voidPromise());
}
}
},connectTimeoutMillis,TimeUnit.MILLISECONDS);
}
promise.addListener(newChannelFutureListener(){
@Override
publicvoidoperationComplete(ChannelFuturefuture)throwsException{
if(future.isCancelled()){
if(connectTimeoutFuture!=null){
connectTimeoutFuture.cancel(false);
}
connectPromise=null;
close(voidPromise());
}
}
});
}
}catch(Throwablet){
promise.tryFailure(annotateConnectException(t,remoteAddress));
closeIfClosed();
}
}
bind 过程分析
privateChannelFuturedoBind(finalSocketAddresslocalAddress){
//**前面说的initAndRegister**
finalChannelFutureregFuture=initAndRegister();
finalChannelchannel=regFuture.channel();
if(regFuture.cause()!=null){
returnregFuture;
}
if(regFuture.isDone()){
//register动作已经完成,那么执行bind操作
ChannelPromisepromise=channel.newPromise();
doBind0(regFuture,channel,localAddress,promise);
returnpromise;
}else{
......
}
}
@Override
publicChannelFuturebind(SocketAddresslocalAddress,ChannelPromisepromise){
returnpipeline.bind(localAddress,promise);
}
@Override
publicfinalChannelFuturebind(SocketAddresslocalAddress,ChannelPromisepromise){
returntail.bind(localAddress,promise);
}
@Override
publicvoidbind(
ChannelHandlerContextctx,SocketAddresslocalAddress,ChannelPromisepromise)
throwsException{
unsafe.bind(localAddress,promise);
}
365天干货不断微信搜索「猿灯塔」第一时间阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板
Netty 源码解析(九): connect 过程和 bind 过程分析的更多相关文章
- Netty 源码解析(三): Netty 的 Future 和 Promise
今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...
- Netty 源码解析(八): 回到 Channel 的 register 操作
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第八篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...
- Netty 源码解析(七): NioEventLoop 工作流程
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第七篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...
- Netty 源码解析(六): Channel 的 register 操作
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第六篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一 ):开始 Netty ...
- Netty 源码解析(五): Netty 的线程池分析
今天是猿灯塔“365篇原创计划”第五篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty ...
- Netty 源码解析(四): Netty 的 ChannelPipeline
今天是猿灯塔“365篇原创计划”第四篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty ...
- Netty 源码解析(二):Netty 的 Channel
本文首发于微信公众号[猿灯塔],转载引用请说明出处 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty源码解析(一):开始 当前:Netty 源码解析(二): Netty 的 Channel ...
- Netty源码解析—客户端启动
Netty源码解析-客户端启动 Bootstrap示例 public final class EchoClient { static final boolean SSL = System.getPro ...
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...
随机推荐
- (九)不安全的HTTP方法
01 漏洞描述 <HTTP | HTTP报文>中介绍了HTTP的请求方法.在这些方法中,HTTP定义了一组被称为安全方法的方法:GET.HEAD.OPTIONS.TRACE,这些方法不会产 ...
- Java基础(九)
一.总述 多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务.通常,每一个任务称为一个线程,它是线程控制的简称.可以同时运行一个以上线程的程序称为多线程程序. 多进程与多线程的区别: ...
- 【雕爷学编程】MicroPython动手做(08)——零基础学MaixPy之识别颜色
早上用百度搜了一下“颜色识别”,多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点. OpenCV(百度百科)是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运 ...
- 循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理
我们开发的系统,一般可以不用考虑语言国际化的问题,大多数系统一般是给本国人使用的,而且直接使用中文开发界面会更加迅速 一些,不过框架最好能够支持国际化的处理,以便在需要的时候,可以花点时间来实现多语言 ...
- spring cloud 集成分布式配置中心 apollo(单机部署apollo)
一.什么是apollo? Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用 ...
- C语言视频教程下载(百万年薪程序员录制,免费公开)
<C/C++语言高性能服务开发基础>您可以自由下载.传播.发布或其它商业用途. 视频文件共13.6G,提供了QQ群文件和百度网盘两种方法,建议采用QQ群文件下载,速度较快. 一.下载方法 ...
- @codeforces - 549E@ Sasha Circle
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定两个点集 M 与 S,求是否存在一个圆能够分割两个点集. 原 ...
- 一个小小的即时显示当前时间的jqurey控件
效果: <div class="nowTime"> <span></span>年 <span></span>月 < ...
- TensorFlow从0到1之TensorFlow实现单层感知机(20)
简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,它只能解决线性可分的问题.虽然这限制了单层感知机只能应用于线性可分问题,但它具有学习能力已经很好了 ...
- 域名注册诈骗邮件We are an agency engaging in registering brand name and domain names
最近收到了一封自称是某公司的邮件,说有人要注册我已经申请的域名,需要我回复确认,看邮件发件人是个人邮箱,通篇没有提到公司,也不是什么正规机构,大概率就是诈骗邮件了. 为了完全确认这封诈骗邮件,我登陆了 ...