概念
- 传输API的核心Channel接口,被用于所有的IO操作。
Channel的继承
Channel的实现
每个Channel都将会分配一个ChannelPipeline和ChannelConfig。ChannelConfig包含了该Channel的所有配置设置,并且支持热更新。Channel实现是线程安全的,因此可以存储一个Channel的引用以方便自己的使用。
Channel是独一无二的,由于Channel是独一无二的,为了保证顺序Channel实现了Comparable接口,在AbstractChannel中compareTo()如果两个不同的Channel实例有相同的散列码则会抛出异常,ChannelId作为唯一Channel的唯一标识。
- ChannelPipeline持有所有将应用于所有的入站和出站数据以及事件的ChannelHandler实例,ChannelHandler实现了应用程序用于处理状态变化以及数据处理的逻辑,注意这里ChannelPipelie作为ChannelHandler的链是通过ChannelHandlerContext实例进行传播的,ChannelPipeline实现了一个设计模式-拦截过滤器
- ChannelHandler典型的用途包括:
- 将数据从一种格式转换为另外一种格式
- 提供异常的通知
- 提供Channel变为活动或者非活动的通知
- 提供当Channel注册到EventLoop或者从EventLoop注销时通知
- 提供有关用户自定义时间的通知
Channel接口的核心方法
- eventLoop() 返回分配给Channel的EventLoop
- pipeline() 返回分配给Channel的ChannelPipeline
- isActive() 如果Channel是活动的则返回true,活动的意义可能依赖于底层的传输。例如一个Socket传输一旦连接到了远程节点便是活动的。
- localAddress() 返回本地的SocketAddress信息
- remoteAddress() 返回远程的SocketAddress信息
- write() 将数据写到远程节点,这个数据被传递给ChannelPipeline,并且排队直到它被冲刷
- flush() 将之前已写的数据冲刷到底层传输,如一个Socket
- writeAndFlush() 将write()和flush()合二为一
