netty 源码分析之(八)Channel

和Channel相关的接口及类结构图如下:

netty 源码分析之(八)Channel

从该结构图也可以看到,Channel主要提供的功能如下:

1)当前Channel的状态信息,比如是打开还是关闭等。

2)通过ChannelConfig可以得到的Channel配置信息。

3)Channel所支持的如read、write、bind、connect等IO操作。

4)得到处理该Channel的ChannelPipeline,既而可以调用其做和请求相关的IO操作。

在Channel实现方面,以通常使用的nio socket来说,Netty中的NioServerSocketChannel和NioSocketChannel分别封装了java.nio中包含的 ServerSocketChannel和SocketChannel的功能。

Netty实现了自己的一套完整Channel系统,这个channel说实在也是对java 网络做了一层封装,加上了SEDA特性(基于事件响应,异步,多线程等)。其最终的网络通信还是依靠底下的java网络api。提到异步,不得不提到Netty的Future系统,从channel的定义来说,write,bind,connect,disconnect,unbind,close,甚至包括setInterestOps等方法都会返回一个channelFuture,这这些方法调用都会触发相关网络事件,并且在pipeline中流转。Channel很多方法调用基本上不会马上就执行到最底层,而是触发事件,在pipeline中走一圈,最后才在channelsink中执行相关操作,如果涉及网络操作,那么最终调用会回到Channel中,也就是serversocketchannel,socketchannel,serversocket,socket等java原生网络api的调用,而这些实例就是jboss实现的channel所持有的(部分channel)。
netty 源码分析之(八)Channel

Netty新版本出现了一个特性zero-copy,这个机制可以使文件内容直接传输到相应channel上而不需要通过cpu参与,也就少了一次内存复制。Netty内部ChunkedFile 和 FileRegion 构成了non zero-copy 和zero-copy两种形式的文件内容传输机制,前者需要CPU参与,后者根据操作系统是否支持zero-copy将文件数据传输到特定channel,如果操作系统支持,不需要cpu参与,从而少了一次内存复制。ChunkedFile主要使用file的read,readFully等API,而FileRegion使用FileChannel的transferTo API,2者实现并不复杂。Zero-copy的特性还是得看操作系统的,本身代码没有很大的特别之处。

相关推荐