认识NIO

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的服务端和客户端构建的时候,会做详细的源码解析。

有个形象的比喻:
http://blog.csdn.net/linuu/article/details/51836281

3 NIO与AIO

AIO,就是我们常说的异步IO,是在NIO2.0中提出来的。由于相比于同步阻塞的传统方式,NIO是异步的,因此很多人习惯于称NIO为异步非阻塞I/O。下面列出了BIO、AIO和NIO的一些区别,看看就好,这一点不必过分纠结

不同点BIONIOAIO
是否阻塞阻塞非阻塞非阻塞
I/O线程个数每个线程处理一个客户端每个线程处理多个客户端被动回调,不需要额外启动I/O线程
是否同步同步同步(多路复用)异步
调试难度
可靠性和吞吐量

4 为什么选择Netty

直接使用JDK原生的API开发NIO程序,编程者的任务量、编程难度都很大。Netty则为我们提供了相对成熟得多的解决方案,综合性能好,相比于原生API大大减轻了开发者的工作难度,而且拥有活跃的社区。目前Hadoop等都在使用Netty作为底层通信框架。

当然,并不是所有Java网络编程都需要用到Netty,在并发量要求不高的时候,选择BIO可以降低调试难度。

说明
如有转载,请务必在文章开头注明出处:
http://blog.csdn.net/antony9118/article/details/52126189

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值