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);

相关文章
|
1月前
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
|
1月前
|
缓存 Java UED
BIO、NIO、AIO有什么区别
【8月更文挑战第16天】BIO、NIO、AIO有什么区别
27 4
|
1月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
34 2
|
26天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
54 0
|
1月前
|
存储 网络协议 Java
【Netty 神奇之旅】Java NIO 基础全解析:从零开始玩转高效网络编程!
【8月更文挑战第24天】本文介绍了Java NIO,一种非阻塞I/O模型,极大提升了Java应用程序在网络通信中的性能。核心组件包括Buffer、Channel、Selector和SocketChannel。通过示例代码展示了如何使用Java NIO进行服务器与客户端通信。此外,还介绍了基于Java NIO的高性能网络框架Netty,以及如何用Netty构建TCP服务器和客户端。熟悉这些技术和概念对于开发高并发网络应用至关重要。
49 0
|
2月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
131 1
|
2月前
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
48 0
|
3月前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
55 2
|
3月前
|
存储 监控 Java
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
|
3月前
|
Java
谈谈NIO和BIO区别
谈谈NIO和BIO区别
31 0