概念

  1. 传输API的核心Channel接口,被用于所有的IO操作。

Channel的继承
image.png
Channel的实现
image.png
每个Channel都将会分配一个ChannelPipeline和ChannelConfig。ChannelConfig包含了该Channel的所有配置设置,并且支持热更新。Channel实现是线程安全的,因此可以存储一个Channel的引用以方便自己的使用。
Channel是独一无二的,由于Channel是独一无二的,为了保证顺序Channel实现了Comparable接口,在AbstractChannel中compareTo()如果两个不同的Channel实例有相同的散列码则会抛出异常,ChannelId作为唯一Channel的唯一标识。

  1. ChannelPipeline持有所有将应用于所有的入站和出站数据以及事件的ChannelHandler实例,ChannelHandler实现了应用程序用于处理状态变化以及数据处理的逻辑,注意这里ChannelPipelie作为ChannelHandler的链是通过ChannelHandlerContext实例进行传播的,ChannelPipeline实现了一个设计模式-拦截过滤器
  2. ChannelHandler典型的用途包括:
  • 将数据从一种格式转换为另外一种格式
  • 提供异常的通知
  • 提供Channel变为活动或者非活动的通知
  • 提供当Channel注册到EventLoop或者从EventLoop注销时通知
  • 提供有关用户自定义时间的通知

Channel接口的核心方法

  1. eventLoop() 返回分配给Channel的EventLoop
  2. pipeline() 返回分配给Channel的ChannelPipeline
  3. isActive() 如果Channel是活动的则返回true,活动的意义可能依赖于底层的传输。例如一个Socket传输一旦连接到了远程节点便是活动的。
  4. localAddress() 返回本地的SocketAddress信息
  5. remoteAddress() 返回远程的SocketAddress信息
  6. write() 将数据写到远程节点,这个数据被传递给ChannelPipeline,并且排队直到它被冲刷
  7. flush() 将之前已写的数据冲刷到底层传输,如一个Socket
  8. writeAndFlush() 将write()和flush()合二为一