NIO编程

NIO的场景:
与Socket、ServerSocket对应,NIO提供了SocketChannel、ServerSocketChannel两种不同的套接字通道实现,两种新增通道都支持阻塞、非阻塞两种模式。阻塞模式使用简单,但是性能、可靠性不好;非阻塞模式相反。
一般,低负载、地并发的应用可选择同步阻塞以降低编程复杂度;高负载、高并发的应用要使用NIO的非阻塞模式

NIO类库关键概念

  1. buffer
    一个对象,包含要写入、读出的数据。在面向流的IO中,可将数据直接写入Buffer,或将数据读到Stream中。
    NIO中所有数据都是Buffer处理的。读,是直接读到buffer中的;写,是直接写到buffer中的。任何时候访问NIO数据,都是通过Buffer操作的。
    常用ByteBuffer,类似有LongBuffer、DoubleBuffer,etc。
  2. Channel
    Channel,通道,像自来水管,网络数据通过Channel读、写。
    Channel与Stream区别在于:Channel是双向的,流只在一个方向移动,Channel可同时用于读写。
    换言之:Channel是全双工的,可以比Stream更好操作OS的API。Unix网络模型中,OS的通道都是全双工的,支持同时读写。

     Channel分两大类:
     - 用于网络读写的SelectableChannel
     - 用于文件操作的FileChannel
    
  3. Selector(多路复用器)
    Selector提供选择已经就绪的任务的能力
    Selector就是不断轮询注册到其上的Channel,若某Channel发生读、写,Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可获取就绪Channel的集合,进行后续的IO操作。
    一个Selector可同时轮询多个Channel,JDK使用epoll代替Select实现,没有最大句柄数的限制,所以,一个线程负责Selector的轮询,就可接入成千上万个客户端

NIO服务端序列

NIO服务端序列图

阅读更多
个人分类: NIO
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭