学习 java netty -- Channel

Posted 西邮Linux兴趣小组

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习 java netty -- Channel相关的知识,希望对你有一定的参考价值。

今天我们来学习本系列的最后一篇,netty封装的Channel。

官网定义

A nexus to a network socket or a component which is capable of I/O operations such as read, write, connect, and bind. 
可以I/O操作(如读,写,连接和绑定)的连网套接字或组件。

A channel provides a user: 
All I/O operations are asynchronous 
netty中channel所有的操作都是异步的,请求将立即返回,但不保证请求完成。

Channels are hierarchical 
channel是分层的,一个Channel可以有一个父母,取决于它是如何创建的,比如一个SocketChannel(客户端套接字)被ServerSocketChannel(服务端套接字)连接了,那么ServerSocketChannel就类似于SocketChannel的 parent。

Downcast to access transport-specific operations 
向下转型来访问特定的传输协议,也就是说转为子类型也可以访问父类型的操作。

Release resources 
释放资源,Channel内部也是Socket文件句柄,我们要close()。

Channel是netty抽象出来的接口,不同与Nio中的channel,netty中的Channel封装了网络IO和网络IO相关的操作,功能非常多。

源码

学习 java netty (三) -- Channel
学习 java netty (三) -- Channel

  从接口类可以看出Channel操作是非常多的,后面的方法我没有写注释,可以看见都是一些操作,返回ChannelFuture或者ChannelPromise,下面选一些重点来解释。

Channel

学习 java netty (三) -- Channel

  封装了许多协议tcp,udp等,通讯模型Nio,oio,Aio等,从上面可以看出对这些操作提供了一个整体的封装接口就是Channel,必要的时候可以进行转型。 
  接口中提供: Channel的状态,isOpen(),isWritable(); Channel的配置参数,config() ;Channel支持的操作,bind(),read(),connect()。

ChannelFuture

学习 java netty (三) -- Channel

  所有的Channel操作都是异步的,Channel的返回ChannelFuture的一些操作并不阻塞,而是立即返回,在未来某个时刻我们能够获得状态来判断该操作的状态是完成还是进行还是取消。 
  注意ChannelFuture对象是操作一执行就立即返回了。ChannelFuture中提供的方法就是让检查操作完成状况。

ChannelPromise

学习 java netty (三) -- Channel

继承关系: 
  Future <— ChannelFuture <— ChannelPromise 

  ChannelPromise继承了ChannelFuture,ChannelFuture方法主要是判断操作未来的状态,而ChannelPromise除了继承ChannelFuture的方法外,还实现了设置未来状态的写方法, 源码上写的是 :Special {@link ChannelFuture} which is writable,特殊的可写的ChannelFuture。比如ChannelFuture返回错误等情况,当我们使用ChannelPromise时,就能改变返回结果,唤醒其他操作,有点线程中条件变量的感觉。

ChannelPipeline

学习 java netty (三) -- Channel

  说到ChannelPipeline先要说责任链设计模式,简单来讲就是将一些能处理请求的对象串起来形成一条链,被处理的对象不知道被谁处理,所以在这条处理链上轮寻过,该被谁处理谁就接受此对象进行处理。 
  现实生活的例子,比如上级分派了一个任务做一款软件(被处理对象),放眼望去有一排攻城狮(处理请求对象),于是此任务在他们之间传递,每个攻城狮判断自己是否能做,能做就接受请求。

  pipeline就是这条责任链,我们可以往上面注册,增添,删除处理事件对象,然后当待处理对象在此pipeline上传递时,哪个处理事件对象能处理则接收它。

  简而言之:ChannelPipeline 是 ChannelHander 的容器,它负责 ChannelHander 的管理和事件拦截与调度。 

学习 java netty (三) -- Channel

部分代码

学习 java netty (三) -- Channel
学习 java netty (三) -- Channel

ChannelHandler

学习 java netty (三) -- Channel

  ChannelHandler就是ChannelPipeline上面注册的处理事件对象,每个ChannelHandler接口的实现类完成一定的功能,并可以灵活的在Pipeline流水线上增加,ChannelHandler也称为事件拦截器,遇到能处理的对象事件就拦截下来处理 。
  ChannelHandler支持注解 。@Sharable是多个Pipeline共用一个ChannelHandler ,@skip是跳过此ChannelHandler。

ChannelHandlerAdapter

学习 java netty (三) -- Channel

  ChannelHandlerAdapter给用户提供了ChannelHandler的适配器,我们可以自定义类来继承ChannelHandlerAdapter然后根据自己需要如何处理事件对象来重新实现ChannelHandler的方法。

学习 java netty (三) -- Channel

例子

学习 java netty (三) -- Channel


  到此Channel和Channel关系密切的类和接口差不多就简单介绍完了,我们大致能知道它们的原理和它们的用法后,再看和使用其他继承它们的拓展类就方便多了。

(更多详细内容,点击左下角【阅读原文】)


以上是关于学习 java netty -- Channel的主要内容,如果未能解决你的问题,请参考以下文章

学习 java netty -- ServerBootstrap

学习 java netty -- ServerBootstrap

Java NIO三组件——Selecotr/Channel实现原理解析

Java NIO三组件——Selecotr/Channel实现原理解析

java proxy 转包

NIO-Channel