前言
最近又重新研究了一下Netty,里面一些关于很多名词又重新学习了一下,这些笔记仅为学习记录。这一次主要学习理解一下NIO中的Selector。
我是在NioEventLoopGroup看到此类是用Selector实现的,而Selector是基于Channel的,这个先不提。
IO和NIO
一. IO
首先我们学Java的都知道I/O,在java.io里有很多I/O类,例如读文件的时候用的FileInputStream。
1. 单向的
我们可以发现,这些IO类都是成双成对的,一个InputStream就会有一个对应OutputStream,所以我们可以得出结论:IO数据是基于流(Stream)单向传输的。
2. 阻塞的
以FileInputStream的read()为例。方法描述:从输入流中读取一个字节的数据,如果没有可用的输入,这个方法将被阻塞。
也就是说,当调用read()的时候,线程被阻塞,只有读取到数据的时候,才会返回一个int。如果迟迟读取不到数据,那么线程一直会被阻塞,这个线程也干不了其他的事情。
3. 面向流
面向流意味着read()每次从流中读一个或多个字节,直至读取所有字节返回-1,没有缓存。
二. NIO
Non-blocking I/O,也称为New I/O。Buffer、Channel、Selector是NIO的三大组件。
1. 双向传输
Channel(通道)提供了双向传输的能力。程序在与文件、socket等建立了channel之后,既可以从channel里面读取数据,也可以往里面写入数据。
2. 缓冲区
NIO会将数据读取到buffer缓冲区内,基于缓冲区进行数据操作。
同时我们还可以对buffer进行一系列的操作。
3. 非阻塞的
在调用read()方法读取Channel时,当没有可读数据时,会直接返回0,而不是阻塞线程。
4. Selector
一个多路转换器,。
但是只能服务于SelectableChannel,在右侧可以看到其子类。为什么??就拿SocketChannel来说,socket分为服务端和客户端,在服务端用于接收客户端的数据。当一个客户端和服务端建立连接之后,