天天看点

【Netty】netty学习之nio了解

【一】五种IO模型:

(1)阻塞IO

(2)非阻塞IO(任务提交,工作线程处理,委托线程等待工作线程处理结果的同时,也可以做其他的事情)

(3)IO复用模型.(委托线程接收多个任务,将任务提交给工作线程。委托线程等待多个工作线程结果,等待到其中一个,处理其中一个具体的工作)

(4)信号驱动模型

(5)异步IO模型

【二】网络编程

(1)网络编程的基本模型:Client/Server模型,也就是两个进程之间进行相互通信。其中服务端提供位置信息(绑定的ip地址和监听的端口号),客户端通过链接操作向服务端监听的地址发起连接请求。通过三次握手建立链接,如果建立链接成功,双方就可以通过网络套接字(Socket)进行通信。

【三】阻塞IO和非阻塞IO的区别

(1)IO的操作:对硬盘的读写、对socket的读写以及外设的读写。

(2)IO读请求操作包括两个 阶段:

    --->查看数据是否就绪;

    --->进行数据拷贝(内核将数据拷贝到用户线程)。

(3)阻塞IO:当用户线程发起一个IO请求操作(本文以读请求操作为例),内核会去查看要读取的数据是 否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直在那等待,直到数据就绪

(4)非阻塞IO:当用户线程发起一个IO请求操作(本文以读请求操作为例),内核会去查看要读取的数据是 否就绪,对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线 程当前要读的数据没有就绪。当数据就绪之后,便将数据拷贝到用户线程

(5)那么阻塞(blocking IO)和非阻塞(non-blocking IO)的区别就在于第一个阶段,如果数据没有就绪,在查看数据是否就绪的过程中是一直等待,还是直接返回一个标志信息。Java中传统的IO都是阻塞IO,比如通过socket来读数据,调用read()方 法之后,如果数据没有就绪,当前线程就会一直阻塞在read方法调用那里,直到有数据才返回;而如果是非阻塞IO的话,当数据没有就绪,read()方法 应该返回一个标志信息,告知当前线程数据没有就绪,而不是一直在那里等待。

【四】:BIO和NIO

BIO

===>阻塞IO通信,通常导致通信线程被长时间阻塞。

NIO

===>IO多路复用技术

===>非阻塞IO.

【五】:NIO的几个关键的类

(1)缓冲区Buffer

===>Buffer是一个对象,它包含一些要写入或要读出的数据。

===>在NIO的库中,所有数据都是用缓冲区处理的。在读取数据时候,它是直接读到缓冲区中进行的。在写数据时候,写入缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。

===>缓冲区实质上是一个数组,通常它是一个字节数组(ByteBuffer),也可以是其他种类的数组。但一个缓冲区不仅仅是一个数组,缓冲区提供了对数据结构化访问以及维护读写位置等信息。

===>ByteBuffer(字节缓冲区),CharBuffer(子符缓冲区),ShortBuffer(短整型缓冲区),IntBuffer(整型缓冲区),LongBuffer(长整型缓冲区),FloatBuffer(浮点型缓冲区),DoubleBuffer(双精度浮点型缓冲区)

(2)通道Channel

===>Channel是一个通道,可以通过它读取和写入数据

===>它就像自来水管一样,网络数据通过Channel读取和写入。

===>通道与流不同之处在于通道是双向的。流只是在一个方向上移动(一个流必须是InputStream或者OutputStream)

===>而且通道可以用于读,写或同时用于读写。

===>Channel分为两大类,分别是用于网络读写的SelectableChannel和用于文件操作的FileChannel

===>NIO网络编程的ServerSocketChannel和SocketChannel都是SelectabelChannel的子类。

(3)多路复用器Selector

===>它是javaNio编程的基础,熟练掌握Selector对于掌握NIO编程至关重要。

===>多路复用器提供选择已经就绪的任务的能力。

===>简单的来讲,Selector会不断轮询注册在其上的Channel。如果某个Channel上面有新的TCP连接接入,读和写事件。这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。

===>一个多路复用器Selector可以同时轮询多个Channel,由于JDK使用epoll()代替传统的select实现。所以它并没有最大连接句柄1024/2048的限制。这也意味者只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。

【六】NIO实现服务端通信序列图

【Netty】netty学习之nio了解

NIO简单实现服务端代码

【Netty】netty学习之nio了解
【Netty】netty学习之nio了解

View Code

【七】Nio客户端链接

【Netty】netty学习之nio了解

NIO简单实现客户端代码

【Netty】netty学习之nio了解
【Netty】netty学习之nio了解