Netty BIO/NIO/AIO介绍

简介: Netty BIO/NIO/AIO介绍

概念介绍
1、 BIO(blocking I/O):同步阻塞IO,也即是传统的I/O。

2、 NIO (non-blocking IO): 也即是New I/O,使用它可以提供非阻塞式的高伸缩性网络。

3、AIO 即 NIO2.0, 叫做异步不阻塞的 IO。 AIO 引入异步通道的概念, 采用了 Proactor 模式, 简化了程序编写,有效的请求才启动线程, 它的特点是先由操作系统完成后才通知服务端程序启动线程去处理, 一般适用于连接。

NIO的三大神器
NIO弥补了原来的同步阻塞I/O的不足,它在标准java代码中提供了高速的 、面向块的I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO不适用本机代码就可以利用低级优化, 这是与BIO的本质区别。NIO主要包含三大组件应用:Buffer缓冲区、Channel通道、多路复用器Selector。

   Buffer缓冲区

    Buffer就是一个对象,它包含一些要写入的或者要读出的数据。NIO中加入了Buffer对象,这也是体现了与传统IO的一个重要区别。在NIO中,所有的数据都是用Buffer缓冲区来处理的。在读取数据时,它是直接读到缓冲区中;再写入数据时,也是写入到缓冲区中。任何时候访问NIO数据,都是通过缓冲区进行操作。

    Buffer缓冲区实质上是一个数组,通常它是一个ByteBuffer(字节数组),当然也可以使用其他类的数组。但是一个缓冲区不仅仅是一个数组,缓冲区提供了对数据结构化访问以及维护读写位置(limit)等信息。最常用的ByteBuffer,一个ByteBuffer 提供了一组功能操作byte数组。

    ByteBuffer:字节缓冲区   

    CharBuffer:字符缓冲区       

    ShortBuffer:短整型缓冲区

    IntBuffer:整形缓冲区

    LongBuffer:长整型缓冲区

    FloatBuffer:浮点型缓冲区

    DoubleBuffer:双精度浮点型缓冲区

继承关系图:

    Channel通道

    Channel通道,它类似一个自来水管一样的模型,网络数据通过Channel读取和写入。通道与流的区别是通道是双向的。流只是一个方向的移动。而Channel可以用于读、写或者二者同时进行。

Channel主要分为两大类:用于网络读写的SelectableChannel 和用于文件操作的FileChannel。

而我们使用的ServerSocketChannel 和 SocketChannel 都是 SelectableChannel的子类。

     多路复用器Selector

    多路复用器提供了选择已经就绪的任务的能力。简单的说,Selector会不断的轮询注册​​​注册在其上的Channel,如果某个Channel上边发生了读或者写的事件,这个Channel就处于就绪状态,会被Selector轮询出来。然后通过SelectionKey可以获取就绪的Channel集合,进行I/O操作。一个多路复用器可以同时轮询多个Channel,JDK使用了epoll()代替了原来的select的实现。这就意味着只需要一个线程就可以接入成千上万的客户端。

    NIO服务端通信序列图:如下



     详解NIO客户端主要的创建过程:

1、打开ServerSocketChannel,用于监听客户端链接,它是所有客户端链接的父管道。

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
2、绑定需要监听的接口,设置链接模式为非阻塞模式

serverSocketChannel.socket().bind(new InetSocketAddress(InetAddress.getByName("IP"),port));
serverSocketChannel.configureBlocking(false);
3、创建Reactor线程,创建多路复用器并启动线程。

Selector selector = Selector.open();
new Thread(new ReactorTask()).start();
4、将ServerSocketChannel 注册到复用selector上

SelectionKey key = serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT,ioHandler);

相关文章
|
网络协议 Dubbo Java
一文搞懂NIO、AIO、BIO的核心区别(建议收藏)
本文详细解析了NIO、AIO、BIO的核心区别,NIO的三个核心概念,以及NIO在Java框架中的应用等。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文搞懂NIO、AIO、BIO的核心区别(建议收藏)
|
6月前
|
消息中间件 缓存 网络协议
Netty基础—4.NIO的使用简介
本文详细介绍了Java NIO(New Input/Output)的核心概念与编程模型。首先,讲解了Buffer缓冲区的作用及4个核心概念:capacity、limit、position、mark,并通过Direct模式创建的Buffer示例展示了其高性能特点。接着,分析了Channel通道的概念,说明其与Buffer的关系以及FileChannel在文件读写中的应用,包括顺序写、随机写和多线程安全特性。 随后,对比了BIO(Blocking IO)编程模型的局限性,如线程资源耗尽问题,引出伪异步IO编程的改进方案,但指出其仍存在级联故障风险。进一步探讨了长连接与短连接的区别及其实现代码。
|
9月前
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
296 0
|
Java
BIO、NIO、AIO 有什么区别
BIO(阻塞I/O)模型中,服务器实现模式为一个连接一个线程;NIO(非阻塞I/O)使用单线程或少量线程处理多个请求;AIO(异步I/O)则是在NIO基础上进一步优化,采用事件通知机制,提高并发处理能力。
407 6
|
Java Linux 应用服务中间件
【编程进阶知识】高并发场景下Bio与Nio的比较及原理示意图
本文介绍了在Linux系统上使用Tomcat部署Java应用程序时,BIO(阻塞I/O)和NIO(非阻塞I/O)在网络编程中的实现和性能差异。BIO采用传统的线程模型,每个连接请求都会创建一个新线程进行处理,导致在高并发场景下存在严重的性能瓶颈,如阻塞等待和线程创建开销大等问题。而NIO则通过事件驱动机制,利用事件注册、事件轮询器和事件通知,实现了更高效的连接管理和数据传输,避免了阻塞和多级数据复制,显著提升了系统的并发处理能力。
294 0
【Netty】NIO 网络编程 聊天室案例(三)
【Netty】NIO 网络编程 聊天室案例(三)
231 0
【Netty】NIO 网络编程 聊天室案例(三)
【Netty】NIO 网络编程 聊天室案例(二)
【Netty】NIO 网络编程 聊天室案例(二)
212 0
【Netty】NIO 网络编程 聊天室案例(一)
【Netty】NIO 网络编程 聊天室案例(一)
273 0
|
6月前
|
算法 Java 容器
Netty源码—4.客户端接入流程
本文主要介绍了关于Netty客户端连接接入问题整理、Reactor线程模型和服务端启动流程、Netty新连接接入的整体处理逻辑、新连接接入之检测新连接、新连接接入之创建NioSocketChannel、新连接接入之绑定NioEventLoop线程、新连接接入之注册Selector和注册读事件、注册Reactor线程总结、新连接接入总结