认识NIO
来源:互联网 发布:淘宝泳衣模特是谁 编辑:程序博客网 时间:2024/06/05 15:03
1 NIO的优势
NIO,也就是所谓的non-blocking I/O,翻译成中文就是非阻塞I/O。在电商、大数据、游戏、金融等高负载、高并发的领域,传统的阻塞式I/O(BIO)越来越不能满足人们的日常使用需求,最显著的特点就是处理性能差,这已经不是业务逻辑层面可以解决的问题。每次客户端请求发过来之后,服务器都要创建线程去处理;并且如果没有东西可读/写的时候,程序就进入等待状态,直到有东西可读/写为止,这就是“阻塞”。
在这种背景下,非阻塞NIO的应运而生和逐步成熟很好地解决了这一问题。服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。
2 NIO核心组件
NIO有很多组件,最核心的是以下三个:缓冲区Buffer、通道Channel、多路复用器Selector,下面我们逐一介绍:
2.1 缓冲区Buffer
缓冲区的本质是数组,最常用的是字节数组ByteBuffer,当然,除了boolean之外的每一种数据类型都有对应的数组,例如整型数组IntBuffer等等。NIO中,所有数据都读写到缓冲区中。
2.2 通道Channel
相比于只能单向传输的stream(InputStream/OutputStream二选一),Channel可以同时进行网络数据的读写。Channel主要分为两大类:用于操作文件的FileChannel和用于网络读写的SelectableChannel(其子类包括ServerSocketChannel和SocketChannel)。
2.3 多路复用器Selector
Selector的主要作用是不断轮询注册在其上的Channel(没有最大连接句柄的限制,一个线程就可以轮询数以万计的客户端),如果某个Channel发生读或者写,表明它处于就绪状态,这样轮询下去就可以通过SelectionKey获取就绪Channel的集合,并进一步进行I/O操作。
2.4 NIO原理图
这里不做NIO的服务端、客户端的具体源码分析,在后面的博客中Netty的服务端和客户端构建的时候,会做详细的源码解析。
3 NIO与AIO
AIO,就是我们常说的异步IO,是在NIO2.0中提出来的。由于相比于同步阻塞的传统方式,NIO是异步的,因此很多人习惯于称NIO为异步非阻塞I/O。下面列出了BIO、AIO和NIO的一些区别,看看就好,这一点不必过分纠结
4 为什么选择Netty
直接使用JDK原生的API开发NIO程序,编程者的任务量、编程难度都很大。Netty则为我们提供了相对成熟得多的解决方案,综合性能好,相比于原生API大大减轻了开发者的工作难度,而且拥有活跃的社区。目前Hadoop等都在使用Netty作为底层通信框架。
当然,并不是所有Java网络编程都需要用到Netty,在并发量要求不高的时候,选择BIO可以降低调试难度。
说明
如有转载,请务必在文章开头注明出处:
http://blog.csdn.net/antony9118/article/details/52126189
- 认识NIO
- 认识java nio
- Java BIO, NIO, AIO的一些粗浅认识
- 从头认识java-16.5 nio的数据转换
- java非阻塞式IO NIO 初步认识
- nio
- NIO
- NIO
- nio
- NIO
- NIO
- nio
- Nio
- NIO
- NIO
- NIO
- nio
- NIO
- 简单配置Apache服务器
- 杭电2041解题报告
- C语言基础学习学习前的准备-1
- 架构很烂,但没人在意
- Gradle脚本基础全攻略
- 认识NIO
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
- 如何使用MathType编辑书名号
- 安卓fragment 的commit already called错误处理
- (转载)Nim游戏博弈(收集完全版)
- 基础对发展高度的重要性
- 16位汇编写的五子
- 《算法学习与数据结构》part1 算法分析与数据结构之表、栈和队列
- hdu1540 Tunnel Warfare--单点更新查询 & 区间合并