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实现简易计算器
import java.util.Scanner; public class Demo_1 { public static void main(String[] args) { //输入的两个数字进行 ...
- Java实现第十届蓝桥杯旋转
试题 F: 旋转 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分 [问题描述] 图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时 针旋转 90 度. 我们用一个 ...
- 呀,葵花宝典![IT项目经理成长晋升记2]
走出办公室时,老吴让王小白认真看下公司的项目管理体系和质量管理体系培训材料.公司这几年连续通过了ISO质量体系认证,通过了CMMI3,已有一套完整的组织过程体系. 因为从投标开始,到公示,还有一周时间 ...
- 基于ABP做一个简单的系统——实战篇:1.项目准备
现阶段需要做一个小项目,体量很小,业务功能比较简单,就想到用最熟悉的.net来做,更何况现在.net core已经跨平台,也可以在linux服务器上部署.所以决定用.net core 3.1+mysq ...
- Android开发之StrictMode
StrictMode简介 Android开发者官网对StrictMode的介绍 StrictMode类是Android 2.3(API 9)引入的一个工具类 用来帮助开发者发现代码中一些不规范的问题, ...
- Unable to open debugger port (127.0.0.1:55119): java.net.SocketException "Socket closed"
1.端口问题 排查端口,lsof -i:8080 修改端口等 2.权限问题 端口排查无解的话,查看idea Event Log(View->Tool Window->Event Log) ...
- 最后一面挂在volatile关键字上,面试官:重新学学Java吧!
最后一面挂在volatile关键字上,面试官:重新学学Java吧! 为什么会有volatile关键字? volatile: 易变的; 无定性的; 无常性的; 可能急剧波动的; 不稳定的; 易恶化的; ...
- LaTeX常用符号(持续更新)
参考网址:https://qianwenma.cn/2018/05/17/mathjax-yu-fa-can-kao/# 基本运算 1.乘法$x\times y$ x\times y 2.乘法$x^{ ...
- Jupyter notebook常用命令合计
shift + cr #运行该行并转入下一行 control + cr #运行该行 option + cr #运行该行并插入新行
- 论logstash的玩法(ELK)
本篇文章采用的采用的是logstash-7.7.0版本,主要从如下几个方面介绍 1.logstash是什么,可以用来干啥 2.logstash的基本原理是什么 3.怎么去玩这个elk的组件logsta ...