初识Channel

java.nio.channels 中的接口和类。

 A channel represents an open connection to an entity such as a hardware device, a file, a network socket, or a program component that is capable of performing one or more distinct I/O operations, for example reading or writing.
  channel就是一个打开的连接向一个实体的连接,这些实体包括硬件设备,文件,网络socket或者程序组件,一个能够执行一个或多个I/O操作。
Channel接口:
  channel只有两个状态open close
  所以在这个接口中只有两个方法
      public boolean isOpen();
   public boolean isClose();
ReadableByteChannel 接口:
  实现了Channel接口
  还有     public int read(ByteBuffer dst) throws IOException; 返回从ByteBuffer中读取的字节数量。
WritableByteChannel接口:
  public int write(ByteBuffer src) throws IOException; 写入src中,返回写入的字节数量。
ScatteringByteChannel 接口
  继承了 ReadableByteChannel 并提供了同时往几个 ByteBuffer 中写数据的能力。
     public long read(ByteBuffer[] dsts, int offset, int length)  throws IOException;
      public long read(ByteBuffer[] dsts) throws IOException;
 GatheringByteChannel 接口
  继承了 WritableByteChannel 并提供了同时从几个 ByteBuffer 中读数据的能力。
    public long write(ByteBuffer[] srcs, int offset, int length)       throws IOException
  public long write(ByteBuffer[] srcs) throws IOException;
InterruptibleChannel 
  A channel that can be asynchronously closed and interrupted.
  用来表现一个可以被异步关闭的 Channel 。这表现在两方面:
1.    当一个 InterruptibleChannel 的 close() 方法被调用时,其它 block 在这个 InterruptibleChannel 的 IO 操作上的线程会接收到一个                  AsynchronousCloseException 。
2.    当一个线程 block 在 InterruptibleChannel 的 IO 操作上时,另一个线程调用该线程的 interrupt() 方法会导致 channel 被关闭,该线程收到一个 ClosedByInterruptException ,同时线程的 interrupt 状态会被设置。
  
  介绍完了其中的接口,接下来介绍一下其中的类:


  
  NIO--非阻塞 IO 允许应用程序同时监控多个 channel 以提高性能,这一功能是通过 Selector , SelectableChannel 和 SelectionKey 这 3 个类来实现的。

  他们之间的关系是这样的(个人理解,欢迎拍砖) ---只是画出了其中的一部分 ,从其他数据源来获取数据。

  
SelectionKey
   A selection key is created each time a channel is registered with a selector.  A key remains valid until it is canceled by call cancel method. 当使用selector 注册一个channel的时候就会创建一个SelectionKey。
  Cancelling a key does not immediately remove it from its selector,It is instead added to the selector`s cancelled-key set.

  在SelectionKey 中维护者两个keySet interest set  和 ready set

     The <i>interest set</i> determines which operation categories will   be tested for readiness the next time one of the selector‘s       selection  methods is invoked. The interest set is initialized with the value given   when the key is created; it may later be        changed via the  interestOps(int)  method.

    The <i>ready set</i> identifies the operation categories for which  the key‘s channel has been detected to be ready by the key‘s       selector.  The ready set is initialized to zero when the key is created; it may later  be updated by the selector during a         selection operation, but it cannot be updated directly.

    Selection keys are safe for use by multiple concurrent threads.  Selection keys是线程安全的,其中的读写操作都使用同步方法      加以控制。 

  构造方法;  他不能通过传统的构造函数的方式来获取构造实例。通常使用Selector中的方法来获取所有的可用的SelectionKey 集合,然后再在其中根据他们各自的状态选择自己真正需要的SelectionKey.

     public abstract Set<SelectionKey> selectedKeys(); 或者     public abstract Set<SelectionKey> keys();

  这其中有几个非常重要的判断方法

        public abstract boolean isValid(); // Tells whether or not this key is valid. 判断是否有效

      public final boolean isReadable();//Tests whether this key‘s channel is ready for reading. 是否可以读取

     public final boolean isWritable() //   Tests whether this key‘s channel is ready for writing.

  还有几个重要的常量,经常用来对SelectionKey的筛选,选择自己所需。

    OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT。后面两个经常用来SocketChannel 和ServerSocketChannel

  另外还可以从中获取selector 和channel

Selector  -- 称之为选择器

  A selector may be created by invoking the  open method of this class.e.g. selector = Selector.open();

  如果想要从channel中获取数据,首先要做的就是将channel 注册到selector上面。

常用方法:

      public abstract boolean isOpen();  Tells whether or not this selector is open

    public abstract int select(long timeout);Selects a set of keys whose corresponding channels are ready for I/O operations;返回当前可用的selecionKeys数量,timeout 表示可以等待的时长。

   public abstract int select() throws IOException; 同上,无需等待直接返回。

SelectableChannel

这个抽象类是所有支持非阻塞 IO 操作的 channel (如 DatagramChannel 、 SocketChannel )的父类。 SelectableChannel 可以注册到一个或多个 Selector 上以进行非阻塞 IO 操作。

SelectableChannel 可以是 blocking 和 non-blocking 模式(所有 channel 创建的时候都是 blocking 模式),只有 non-blocking 的 SelectableChannel 才可以参与非阻塞 IO 操作。

  SelectableChannel configureBlocking(boolean block)    设置 blocking 模式。false,为非阻塞。

boolean isBlocking()      返回 blocking 模式。

通过 register() 方法, SelectableChannel 可以注册到 Selector 上。

  接下来会介绍SelectableChannel的一些子类,欢迎拍砖。

时间: 2024-11-15 18:25:39

初识Channel的相关文章

Redis——学习之路三(初识redis config配置)

我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. 我们就从上到下来理解一下这些配置信息中的某些配置: 1.dbfilename是本地持久化存储数据库文件名,默认为dump.rdb.我可以在安装目录文件夹下找到这个文件. 2.requirepass是密码,即连接服务器的密码,默认为空.下面我来设置一个密码然后用带密码的命令连接一遍. 3.msterauth

初识中间件之消息队列

初识中间件之消息队列 测试那点事儿 测试那点事儿 初识中间件之消息队列 1 消息队列概述 消息队列是分布式系统中的重要组件,主要解决应用耦合,异步消息,流量削锋等问题,以实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统中不可缺少的中间件. 目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等,比如我之前用过的RabbitMQ以及kafka. 2 消息队列应用场景 在实际应用中,消息队列常用于异步处理.应用解耦.流量削锋

初识.Net Remoting

初识.Net Remoting.Net对于远程调用提供了两种方法:Remoting和WebService.WebService现在是如火如荼优点:1.Tcp通道的Remoting速度非常快2.虽然是远程的,但是非常接近于本地调用对象3.可以做到保持对象的状态4.没有应用程序限制,可以是控制台,winform,iis,windows服务承载远程对象缺点:1.不是标准的应用,因此有平台限制(不能想Webservice那样可以跨平台,只要Webservice内部方法能够返回json或者xml数据即可)

capwap学习笔记&mdash;&mdash;初识capwap(四)

2.5.7 CAPWAP传输机制 WTP和AC之间使用标准的UDP客户端/服务器模式来建立通讯. CAPWAP协议支持UDP和UDP-Lite [RFC3828]. ¢ 在IPv4上,CAPWAP控制和数据通道使用UDP.此时CAPWAP报文中的UDP校验和必须设置为0.AC上的CAPWAP控制报文端口为UDP众所周知端口5246,数据报文端口为UDP众所周知端口5247 ,WTP可以随意选择CAPWAP控制和数据端口. ¢ 在IPv6上,CAPWAP控制通道一般使用UDP,而数据通道可以使用U

capwap学习笔记&mdash;&mdash;初识capwap(五)

3. CAPWAP Binding for IEEE 802.11 ¢ CAPWAP协议本身并不包括任何指定的无线技术.它依靠绑定协议来扩展对特定无线技术的支持. ¢ RFC5416就是用来扩展CAPWAP对IEEE 802.11网络的支持.其中定义了控制消息字段,新的控制消息,消息元素. ¢ 注意,这个协议仅支持IEEE 802.11-2007规范,并不支持IEEE 802.11-2007 standard中定义的ad hoc网络模式(即点到点模式,也就是IBSS),也不适用于four-add

capwap学习笔记&mdash;&mdash;初识capwap(三)

2.5.6 CAPWAP状态机详解 2.5.6.1 Start to Idle 这个状态变迁发生在设备初始化完成. ¢  WTP: 开启CAPWAP状态机. ¢  AC:  开启CAPWAP状态机. 2.5.6.2 Idle to Discovery 这个状态变迁发生是为了支持CAPWAP发现进程. ¢   WTP: WTP进入发现状态是为了优先去传输第一个Discovery Request message.在进入这个状态之前,WTP设置发现DiscoveryInterval timer,将Di

golang goroutine channel [fmt.Println=&gt;String]

初识golang,这部分也不是很了解,百度了一下,做个小记录 goroutine是golang用来做并发处理的,使用起来很简单  go func(){...}(),就是看起来随便用一般而容易go的滥用,所以使用时要仔细斟酌才好. channel 大约是用来在线程间传递数据的,主线程开通一个channel,goroutine往channel中存入内容 1.channel只能用make创建 c := make(chan int) 2.channel中存入数据 c<-2  //把2存入到channel

Flume -- 初识flume、source和sink

Flume – 初识flume.source和sink 目录基本概念常用源 Source常用sink 基本概念 ? 什么叫flume? 分布式,可靠的大量日志收集.聚合和移动工具. ? events 事件,是一行数据的字节数据,是flume发送文件的基本单位. ? flume配置文件 重命名flume-env.sh.template为flume-env.sh,并添加[export JAVA_HOME=/soft/jdk] ? flume的Agent source //从哪儿读数据. 负责监控并收

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的