上一篇文章介绍过channel,channel里面主要是封装了对于客户端连接的建立等的一些api,以及socket等,对于封装的api可以进行一些读写
先留两个问题:
1.服务端的socket在哪里初始化?
2.在哪里accept链接?
关于创建channel主要分为以下几个步骤
创建channel
初始化channel
注册selector
其中创建channel的时候调用链路主要为
bind()-》dobind()-〉initandRegister-》new channel
其中initAndRegister内部有一个channelFactory.newChannel这个通过工厂模式来生成chennel的代码
进来之后可以发现他是通过clazz来实现,即通过反射来实现
反射创建服务端channel:
newSocket()
NioServerSocketChannelConfig()
然后执行父类的构造函数
AbstractNioChannel()
这里面会执行
configBlocking(false)
以及AbstractChannel(id,unsafe,pipeline)
客户端和服务端端channel都会继承abstractchannel这个抽象类
其中id是唯一标识,unsafe是底层关于tcp底层的读写的一些操作,
pipeline是后面要讲过的非常重要的组件(其实上一章也提过)
好了,创建channel的步骤基本讲完了,后面要说一下他是如何进行初始化的
init()
setChannelOps setChannelAttrs
setChildOps setChildsAttrs//把用户自定义的两个参数保存起来
configHandler//其实就是把用户输入的handler给他拿到,然后通过pipeline.addLast的方式这样一个逻辑链处理列给他封装进去
addServerBootstrapAcceptor
最后就是注册selector的过程
主要流程如下:
AbstractChannel.register这一个入口进入
this.eventLoop=eventLoop//绑定eventloop
register0()
.doregister()//调用jdk底层注册
pipeline.invokerHandlerAddIfNeeded//传播事件
pipeline.fireChannelRegistered//传播事件
通过最后两次传播事件最后传播到用户方法