NIO-Pile通道详解

Pipe实现单向管道传送的通道对等端.管道是由两端组成:一个可写入的sink通道和一个可读取的source通道(根据数据来源).一旦将某些字节写入接受器通道,就可以按照与写入时完全相同的顺序从源通道中读取这些字节.在另一个线程从管道中读取这些字节或先前已写入的字节之前,是否阻塞将该字节写入管道的线程是与系统相关的,因此是未指定的.

Pipe名为管道,其实底层实现为一个本地的TCP链接:即一个侦听本地port的ServerSocketChannel,以及一个链接到此port上SocketChannel,最终建立连接后获得2个SocketChannel引用;其中Server端的SocketChannel作为Pipe.sink,Client端的SocketChannel作为Pipe.source.因为Sink和Source都封装了高层的SocketChannel,所以它们也支持阻塞模式的设定,最终影响到SocketChannel.

Sink为数据的输出端,此类实现了SeleactableChannel/WritableChannel/GatheringByteChannel,由此可见Sink本身支持中断操作/Selector/write操作;Sink负责向Pipe中写入数据.

Source为数据消费端(读取端),此类实现了SelectableChannel/ReadableChannel/ScatteringByteChannel,它具有Sink的其他特性,但是Source只能read.

Pipe是IO操作中一个有趣的单工模式.大部分情况下,我们无需使用Selector,因为在Pipe中使用selector实在是难以理解:1)无事件切换 2) 必然阻塞性(根据数据流动性).

PipeImpl源码:http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/nio/ch/PipeImpl.java.html

  • public static Pipe open() throws IOException:打开一个通道.通过调用系统级默认的SelectorProvider.openPipe()方法来创建管道.
  • public abstract Pipe.SinkChannel sink():获取通道的输入端.SinkChannel底层封装了作为客户端的SocketChannel,SinkChannel.validOps()只能为OP_WRITE
  • public abstract Pipe.SourceChannel source():获得通道的输出端.SourceChannel底层封装了ServerSocketChannel.accept()得到的SocketChannel,其validOps()只能为OP_READ.

Pile实例参考:http://shift-alt-ctrl.iteye.com/blog/1840414

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值