zoukankan      html  css  js  c++  java
  • java网络编程学习之NIO模型

    网上对NIO的解释有很多,但自己一直没有理解,根据自己的理解画出下面这个图,有什么不对的地方,欢迎留言指出。

    理解是,客户端先与通过通道Channel与连接(注册到服务器端),然后再传送数据,服务器端这时候的处理是,服务器端有个Selector多路复用器,它使用轮询的方式去检测Channel的状态,一旦发现Channel读写事件准备就绪后,就会把Channel与数据缓冲区Buffer进行数据传输,进行相关数据的处理。

    数据缓冲区Buffer

         它一个用于特定基本类型数据的容器。 

                  常用的是ByteBuffer,实际上每一种java基本类型都对应了一种缓冲区(Booolean类型除外),它们都继承了Buffer,是Buffer的子类。分别是:

    类名 名称
    ByteBuffer 字节缓冲区
    CharBuffer 字符缓冲区
    ShortBuffer Short缓冲区
    IntBuffer int 缓冲区
    LongBuffer long缓冲区
    DoubleBuffer double缓冲区
    FloatBuffer float缓冲区

    缓冲区的基本属性包括:内容、容量、限制、位置。

             缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。

             缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。

              缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。          

    多个当前线程使用缓冲区是不安全的。如果一个缓冲区由不止一个线程使用,则应该通过适当的同步来控制对该缓冲区的访问。 

    通道

           像自来水管道一样,网络数据通过Channel读取和写入,通道与流的不同之处在于通道是双向的,而流只能往一个方向上移动(一个流必须是InputStream或者OutStream的子类),而通道可以用于读和写,或者两者同时进行,最关键的还可以与多路复用器结合起来,有多种状态位,方便多路复用器去识别。事实上通道分为两大类,一类是网络读写的(SelectableChannel),另一类是文件操作的(FileChannel

    Selector多路复用器

                它类似一个管理者,管理很多通道,然后通过轮询那个通道的数据已经准备好,通知CPU执行数据的读取和写入工作。

    生于忧患,死于安乐
  • 相关阅读:
    ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
    iOS UI 12 block传值
    iOS UI 11 单例
    iOS UI 08 uitableview 自定义cell
    iOS UI 07 uitableviewi3
    iOS UI 07 uitableviewi2
    iOS UI 07 uitableview
    iOS UI 05 传值
    iOS UI 04 轨道和动画
    iOS UI 03 事件和手势
  • 原文地址:https://www.cnblogs.com/songlove/p/10724613.html
Copyright © 2011-2022 走看看