阅读更多
1 前言
本篇博文以NioSocketChannel以及NioServerSocketChannel为例,分析一下Netty中Channel的结构
2 NioSocketChannel
2.1 继承结构图
2.2 ChannelOutboundInvoker
ChannelOutboundInvoker接口定义了一些与outbound operation相关的方法,类似的方法也在ChannelOutboundHandler接口中有定义
2.3 Channel
Channel接口非常重要,从该接口中可以看出Netty中Channel的基本组成结构
- 每个Channel关联一个EventLoop(一般是NioEventLoop),Channel的所有操作都是通过EventLoop来执行的
- 每个Channel关联一个Unsafe,该Unsafe对象负责完成所有底层的IO操作
- 每个Channel关联一个PipeLine,PipeLine用于织入一些Netty内置的Handler以及用户自定义的Handler,通过Unsafe、Channel以及PipeLine的相互配合从而触发这些Handler的调用
2.4 DuplexChannel
DuplexChannel进一步将Channel抽象成双向的,包含In方向和Out方向
2.5 SocketChannel
SocketChannel进一步引入Socket的相关概念,比如InetSocketAddress,即IP和端口号
2.6 AttributeMap
AttributeMap定义了一种用于添加关键字以及判断关键字是否存在的Map
2.7 DefaultAttributeMap
DefaultAttributeMap抽象类对AttributeMap接口提供了基本的实现
2.8 AbstractChannel
AbstractChannel抽象类对Channel接口(包括Channel的父接口)提供了基本的实现,包含了底层的IO操作
AbstractChannel包含如下关键字段
Channel parent
:与当前Channel相关联的Channel,比如NioServerSocketChannel中创建的NioSocketChannel,那么NioServerSocketChannel就是NioSocketChannel的parent ChannelUnsafe unsafe
:用于底层IO操作的对象,该字段的初始化会调用一个protected方法,AbstractChannel可以重写该方法来绑定特殊的Unsafe对象DefaultChannelPipeline pipeline
:关联的PipeLineSocketAddress localAddress
:本地地址,该地址是抽象的,未指定任何协议SocketAddress remoteAddress
:远程地址,该地址是抽象的,未指定任何协议EventLoop eventLoop
:当前Channel关联的EventLoop,即一个线程池
此外,AbstractChannel抽象类实现了非静态内部类AbstractUnsafe
2.9 AbstractNioChannel
AbstractNioChannel抽象类实现了Channel的isOpen方法,重写了AbstractChannel的几个方法(修改返回类型)
AbstractNioChannel包含如下关键字段
SelectableChannel ch
:底层的Java NIO原生Channelint readInterestOp
:感兴趣的操作SelectionKey selectionKey
:底层的Java NIO原生SelectionKeySocketAddress requestedRemoteAddress
:当主动发起连接时,保存远程的Socket地址
此外,AbstractNioChannel抽象类实现了非静态内部类AbstractNioUnsafe
2.10 AbstractNioByteChannel
AbstractNioByteChannel抽象类实现了Channel接口的metadata方法
此外,AbstractNioByteChannel抽象类实现了非静态内部类NioByteUnsafe(实现read方法)
2.11 NioSocketChannel
NioSocketChannel类实现了DuplexChannel接口以及SocketChannel提供的方法
3 NioServerSocketChannel
3.1 继承结构图
NioServerSocketChannel的继承关系与NioSocketChannel类似,但有以下区别
- AbstractNioByteChannel被替换成了AbstractNioMessageChannel
- DuplexChannel被替换成了ServerChannel
- SocketChannel被替换成了ServerSocketChannel
3.2 ServerChannel
ServerChannel是一个空接口
3.3 ServerSocketChannel
ServerSocketChannel接口修改了Channel接口中的3个方法的返回值
3.4 AbstractNioMessageChannel
AbstractNioMessageChannel抽象类主要定义了非静态内部类NioMessageUnsafe(实现read方法)