netty (三) channel & pipeline

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。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值