channel:
channel关系到一个网络socket或者组件的i/o操作的能力。比如读写,连接,绑定
channel向user提供:
channel的当前状态,比如是否打开,是否连接。
channel的配置参数,比如接收数据的buffer大小。
channel支持的读写操作等,例如读写,连接,绑定
和这个channel关联的channelpipeline,它负责处理所有的io事件和请求
All I/O operations are asynchronous 所有的io操作都是异步执行的
因为所有的io操作都是异步的,所以每次的io调用都能立刻返回结果,但是不保证io的操作都能执行完成。当io操作完成,失败,或者取消的时候你会从你得到的channelfuture对象实例中得到通知。
channel是有层次结构的。产生channel的channel就是它的parent。比如 serversocketchannel接收到socketchannel连接产生新的socketchannel,那么这个serversocketchannel就是socketchannel的parent。这种层次化意义的结构语义取决于channel属于哪种传输的实现。例如,你也可以自己写一个新的channel的实现来产生一些其他的子channel对象来共享一个socket连接。
对于特殊的协议,channel可以向下转型来使用特殊协议的操作。
当使用完channel的时候一定要使用close方法或者close(channelPromise)方法来释放所有的资源。
pipeline
一些channelhandler中负责处理和拦截channel的入站事件和出站的操作。channelpipeline实现了一种拦截过滤模式的更高级的形式,可以使用户更全面的掌控一个事件怎样被处理,channel中的channelhandler是怎样与其他的channelpipeline交互的
每一个channel都有自己的channelpipeline,它是在channel被创建的时候就自动被创建出来了
下图描述了io事件在channelpipeline里的channelhandler是怎样的被处理的。一个io事件要么被channelinboundhandler处理,要么被channeloutboundhandler处理然后转发给另一个最近的hander(通过调用定义在channelhandlercontext里事件传播的方法,例如:ChannelHandlerContext#fireChannelRead(Object),ChannelHandlerContext#write(Object))
通过调用以上的方法就可以传播到下一个最近的channelhandler。
例如:
用户应该给pipeline提供一个或多个channelhandler来处理io事件。具体多少还是要取决于你的协议的复杂性和业务逻辑的特性。
注意:如果channelhandle的业务逻辑比较复杂,那么应该使用异步执行的方式,而不会阻塞住这个channel。
channelpipeline是线程安全的,你可以随时添加或者删除一个channelhandler。