一、Java NIO 网络编程


一、NIO 概述

  • Java NIO(New IO 或 Non Blocking IO 非阻塞 IO)。
    是从 Java-1.4 版本开始引入一个 新的 IO API,可以替代标准的 Java IO API。
  • NIO 支持面向 缓冲区、基于 通道 的 IO 操作。
  • NIO 将以更加高效的方式进行 文件读写 操作。

1. 阻塞 IO

  • 在进行同步 IO 操作时。
  1. 读取数据,会阻塞直至有可供读取的数据。
  2. 写入数据,将会阻塞直至数据能够写入。

  • 传统的 Server/Client 模式,会基于 TPR(Thread per request 每个请求的线程)。
    服务器 会为 每个客户端 请求建立一个线程,由该线程单独负责处理一个客户请求。
  1. 这种模式带来的一个问题,就是线程数量的剧增,大量的线程会增大服务器的开销。
  2. 大多数的使用为了避免这个问题,都采用了 线程池模型,并设置线程池线程的最大数量。
  3. 这由此带来了新的问题,如果线程池中有 100 个线程,而刚好有 100 个用户都在进行大文件下载,会导致第 101 个用户的请求无法及时处理,即便第 101 个用户只想请求一个几 KB 大小的页面。

  • 传统的 Server/Client 模式如下图所示。
    在这里插入图片描述

2. 非阻塞 IO (NIO)

  1. 如 可读数据到达、新的套接字连接 等,在发生特定事件时,系统再通知我们。
  2. NIO 中实现 非阻塞IO 的核心对象就是 Selector
    Selector 就是注册各种 IO 事件地方。
    而且当我们感兴趣的事件发生时,就是这个对象告诉我们所发生的事件。

  • NIO 非阻塞 IO 如下图所示。
    在这里插入图片描述
  1. 从图中可以看出,当有 读 或 写 等任何注册的事件发生时,可以从 Selector 中获得相应的 SelectionKey。
  2. 同时从 SelectionKey 中可以找到 发生的事件 和 该事件发生 的 SelectableChannel,以获得客户端发送过来的数据。

  • 非阻塞 指的是 IO事件 本身不阻塞,但是获取 IO事件 的 select() 方法是需要阻塞等待的
  1. 区别是 阻塞的IO 会阻塞在 IO 操作上,NIO 阻塞在事件获取上,没有事件就没有 IO,从高层次看 IO 就不阻塞了。
  2. 也就是说只有 IO 已经发生,才评估 IO 是否阻塞,但是 select() 阻塞的时候 IO 还没有发生,何谈 IO 的阻塞。
  3. NIO 的本质是 延迟IO,操作要到真正发生 IO 的时候,而不是以前只要 IO流 打开了就一直等待 IO 操作。

3. IO 和 NIO 区别

  • IO 和 NIO 对比。
    在这里插入图片描述

4. NIO 三个核心组件

  • ChannelBufferSelector 构成了核心的 API

4.1 Channel 通道
  • Channel 可以翻译成 通道
    Channel 和 IO 中的 Stream(流)是差不多一个等级的。
  1. Stream 是单向的,如:InputStreamOutputStream
  2. Channel 是双向的,既可以用来进行读操作,又可以用来进行写操作。
  • NIO 中 Channel 的主要实现。
  1. FileChannel 文件 IO。
  2. DatagramChannel UDP。
  3. SocketChannel TCP。
  4. ServerSocketChannel Server/Client。

4.2 Buffer 缓冲区
  • NIO 中 Buffer 的实现。
  1. ByteBuffer byte 类型。
  2. CharBuffer char。
  3. DoubleBuffer double。
  4. FloatBuffer float。
  5. IntBuffer int。
  6. LongBuffer long。
  7. ShortBuffer short。

4.3 Selector 选择器
  • Selector 运行单线程处理多个 Channel
  1. 如果应用打开了多个通道,但每个连接的流量都很低,使用 Selector 就会很方便。
  2. 如在一个聊天服务当中,要使用 Selector,得向 Selector 注册 Channel,然后调用它的 select() 方法。
  3. 这个方法会一直阻塞到某个注册的通道有事件就绪。
    一旦这个方法返回,线程就可以处理这些事件。
  4. 事件的例子有:如新的连接进来、数据接收等。

5. NIO 其他组件


5.1 Pipe 管道

5.2 FileLock 文件锁

5.3 Path 路径类

5.4 Files 文件类

5.5 AsynchronousFileChannel 异步文件通道

5.6 Charset 字符集

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑士梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值