NIO:非阻塞IO
BIO:阻塞IO
1.三大组件
Channel
类似与stream流,是读取数据的双向通道,可以从channel将数据读入buffer,也可以将buffer的数据写入channel,之前的stream要么是输入,要么是输出,从某种方面来说,channnel比buffer更彻底
常见的channel
-
FileChannel 用于文件传输
-
DatagramChannel 用于UDP网络编程
-
SocketChannel TCP,客户端服务端都能用
-
ServerSocketChannel 专注于服务端
Buffer
Buffer 用于缓冲读写数据
一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,如果数据量大,就会造成不必要的资源浪费。 Netty针对这种情况,在堆内存之外开辟一块内存,也就是缓冲区,数据就直接从IO读到了那块内存中去,在netty里面通过ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度。
常用buffer
Selector
当一个连接建立之后,他有两个步骤要做,第一步是接收完客户端发过来的全部数据,第二步是服务端处理完请求业务之后返回response给客户端。NIO和BIO的区别主要是在第一步。 在BIO中,等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的。 而NIO中,当一个Socket建立好之后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,Selector会不断的去遍历所有的Socket,一旦有一个Socket建立完成,他会通知Thread,然后Thread处理完数据再返回给客户端——这个过程是不阻塞的,这样就能让一个Thread处理更多的请求了。所以NIO的并发相对较高,比较适用于连接数高,流量低的情况
BIO
NIO
三大核心原理示意图