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 ...
随机推荐
- Java实现DFS深度优先查找
1 问题描述 深度优先查找(depth-first search,DFS)可以从任意顶点开始访问图的顶点,然后把该顶点标记为已访问.在每次迭代的时候,该算法紧接着处理与当前顶点邻接的未访问顶点.这个过 ...
- java实现Prim算法
1 问题描述 何为Prim算法? 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ...
- Java实现第十届蓝桥杯数列求值
试题 C: 数列求值 本题总分:10 分 [问题描述] 给定数列 1, 1, 1, 3, 5, 9, 17, -,从第 4 项开始,每项都是前 3 项的和.求 第 20190324 项的最后 4 位数 ...
- PAT 数字黑洞
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字黑洞 ...
- js原型链、继承、this指向等老生常谈却依然不熟的知识点——记录解析
开始记录学习过程—— 很详细的解析过程——https://juejin.im/post/5c72a1766fb9a049ea3993e6 借鉴阅读——https://github.com/KieSun ...
- 宇宙第一IDE是谁?
更多精彩文章,尽在码农翻身 微服务把我坑了 如何降低程序员的工资? 程序员,你得选准跑路的时间! 两年,我学会了所有的编程语言! 一直CRUD,一直996,我烦透了,我要转型 字节码万岁! 上帝托梦给 ...
- HashMap(一)之源码分析基本功
1. 位运算 参考 java中位运算^,&,<<,>>,<<<,>>>总结 2. 关键字 transient 理解一下这个关键字,顺 ...
- Java中容易遗漏的小知识点( 一 )(为了和小白一样马上要考试的兄弟准备的,希望小白和大家高过不挂)
笔者csdn博客同文地址:https://blog.csdn.net/weixin_45791445/article/details/106597515 我是小康小白,一个平平无奇的Java小白.热爱 ...
- java特性 JDK JRE JVM
1简单性 2可移植性性(跨平台) 3面向对象 4高性能 5分布式 6动态性 7多线程 8安全性JDK:java开发工具 . JRE:JDK:java运行环境 . JVM:JDK:java虚拟机
- 分析ThreadLocal的弱引用与内存泄漏问题
目录 一.介绍 二.问题提出 2.1内存原理图 2.2几个问题 三.回答问题 3.1为什么会出现内存泄漏 3.2若Entry使用弱引用 3.3弱引用配合自动回收 四.总结 一.介绍 之前使用Threa ...