Netty学习笔记一(NIO基础知识)

什么是NIO

java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

IO和NIO的主要区别

IONIO
面向流面向缓冲
区阻塞IO非阻塞IO
选择器

传统的IO流

在传统IO中当App要对网络,磁盘中的文件进行读写的时候,它们必须建立一个连接,流到底是一个什么样的概念呢,我们可以先把它想象成自来水,家里要用自来水,需要有水管,让水从水管过来到家里,起到一个运输的作用。

所以当我们文件中的数据需要输入到App里面时,它们就会建立一个输入的管道。而当我们的App有数据需要写入到文件系统的时候,就会建立一个输出的管道,这两条管道就是我们的输入流和输出流。那水从来没有逆流而上的呀,所以它们都是单向管道。
在这里插入图片描述

NIO流

同样的文件系统和App,不过此时把流换成了一个channel,现在我们可以先认为它就是一条铁道,那我们知道铁道本身是不能传递货物的呀,所以我们需要一个载具—火车(也就是缓冲区),App需要的数据就由这个名叫缓冲区的载具运输过来。那火车是可以开过来,也可以开回去的,所以NIO是双向传输的。
在这里插入图片描述

NIO的三大组件

Channel & Buffer

channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层
在这里插入图片描述
常见的 Channel 有

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

buffer 则用来缓冲读写数据,常见的 buffer 有

  • ByteBuffer
    • MappedByteBuffer
    • DirectByteBuffer
    • HeapByteBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • CharBuffer

Selector

多线程版本的服务器与客户端的连接是一个对应一个线程,这样会导致线程的占用率过高,cpu处理能力下降。在这里插入图片描述
多线程版本缺点:

  • 内存占用高
  • 线程上下文切换成本高
  • 只适合连接数少的场景

线程池版本设计,一个线程对应多个连接,但是只适用于非阻塞模式下的连接场景。
在这里插入图片描述
线程池版缺点

  • 阻塞模式下,线程仅能处理一个 socket 连接
  • 仅适合短连接场景

selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景(low traffic)
在这里插入图片描述
调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理

参考文档

NIO基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值