BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。  
NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。  
AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

BIO  
同步阻塞式IO,相信每一个学习过操作系统网络编程或者任何语言的网络编程的人都很熟悉,在while循环中服务端会调用accept方法等待接收客户端的连接请求,一旦接收到一个连接请求,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成。  
如果BIO要能够同时处理多个客户端请求,就必须使用多线程,即每次accept阻塞等待来自客户端请求,一旦受到连接请求就建立通信套接字同时开启一个新的线程来处理这个套接字的数据读写请求,然后立刻又继续accept等待其他客户端连接请求,即为每一个客户端连接请求都创建一个线程来单独处理,大概原理图就像这样:  

虽然此时服务器具备了高并发能力,即能够同时处理多个客户端请求了,但是却带来了一个问题,随着开启的线程数目增多,将会消耗过多的内存资源,导致服务器变慢甚至崩溃,NIO可以一定程度解决这个问题。

NIO  
同步非阻塞式IO,关键是采用了事件驱动的思想来实现了一个多路转换器。  
NIO与BIO最大的区别就是只需要开启一个线程就可以处理来自多个客户端的IO事件,这是怎么做到的呢?  
就是多路复用器,可以监听来自多个客户端的IO事件:  
A.   若服务端监听到客户端连接请求,便为其建立通信套接字(java中就是通道),然后返回继续监听,若同时有多个客户端连接请求到来也可以全部收到,依次为它们都建立通信套接字。  
B.   若服务端监听到来自已经创建了通信套接字的客户端发送来的数据,就会调用对应接口处理接收到的数据,若同时有多个客户端发来数据也可以依次进行处理。  
C.   监听多个客户端的连接请求和接收数据请求同时还能监听自己时候有数据要发送。  

总之就是在一个线程中就可以调用多路复用接口(java中是select)阻塞同时监听来自多个客户端的IO请求,一旦有收到IO请求就调用对应函数处理。

各自应用场景

到这里你也许已经发现,一旦有请求到来(不管是几个同时到还是只有一个到),都会调用对应IO处理函数处理,所以:

(1)NIO适合处理连接数目特别多,但是连接比较短(轻操作)的场景,Jetty,Mina,ZooKeeper等都是基于java nio实现。

(2)BIO方式适用于连接数目比较小且固定的场景,这种方式对服务器资源要求比较高,并发局限于应用中。

BIO和NIO的区别相关推荐

  1. 网络编程中BIO和NIO的区别

    网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...

  2. 体验BIO和NIO的区别

    package day04Stream;import java.io.*; import java.nio.channels.FileChannel; import java.nio.file.Pat ...

  3. bio nio aio区别_8分钟深入浅出搞懂BIO、NIO、AIO

    在高性能的IO体系设计中,BIO.NIO.AIO的概念,常常会让我们感到困惑不解.在Java面试中,我们也经常会被问到这个问题.譬如: BIO.NIO.AIO 的概念 同步/异步.阻塞/非阻塞的区别 ...

  4. 高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型

    谈到并发编程就不得不提到NIO,以及相关的Java NIO框架Netty等,并且在很多面试中也经常提到NIO和AIO.同步和异步.阻塞和非阻塞等的区别.我先简短介绍下几个NIO相关的概念,然后再谈NI ...

  5. 谈谈java的bio、nio、aio模型

    目录 socket IO(BIO)和NIO的区别 同步和异步 bio:同步阻塞式IO NIO:同步非阻塞IO(工作中用的很少) Buffer使用 NIO代码 AIO socket Socket又称&q ...

  6. java nio 多路复用_8分钟深入浅出搞懂BIO、NIO、AIO

    在高性能的IO体系设计中,BIO.NIO.AIO的概念,常常会让我们感到困惑不解.在Java面试中,我们也经常会被问到这个问题.譬如: BIO.NIO.AIO 的概念 同步/异步.阻塞/非阻塞的区别 ...

  7. 【Java基础】从Java语言层面理解BIO,NIO,AIO(二)

    文章目录 零.从网络层面理解BIO,NIO,AIO 一.相关概念 1.什么是socket? 2.IP地址(IP Address) 3.端口(Port) 4.协议(Protocol) 4.1.协议简介 ...

  8. 内核aio_Java面试题BIO、NIO、AIO有什么区别?

    点击上方"千锋Java学院",选择"置顶公众号" 每天一道面试模拟真题及解析 课前导读 ●回复"每日一练"获取以前的题目,持续更新! ●我希 ...

  9. 面试被问BIO、NIO、AIO的区别,怎么破?

    来源:juejin.cn/post/6844903985158045703 很多文章在谈论到BIO.NIO.AIO的时候仅仅是抛出一堆定义,以及一些生动的例子.看似很好理解.但是并没有将最基础的本质原 ...

最新文章

  1. 我要学ASP.NET MVC 3.0(一): MVC 3.0 的新特性
  2. Python自然语言处理实战
  3. 可以查python题的_python练习题 -股票查询
  4. 【Flutter】Flutter 拍照示例 ( 浮动按钮及点击事件 | 底部显示按钮组件 | 手势检测器组件 | 拍照并获取当前拍摄照片 | 从相册中选择图片 )
  5. 最优控制理论 一、变分法和泛函极值问题
  6. Ubuntu 16.04 下安装VMware Tools(三行命令搞定,亲测好使)
  7. 《openssl 编程》之数据压缩
  8. 随手练——洛谷-P1008 / P1618 三连击(暴力搜索)
  9. 防止网页后退--禁止缓存
  10. 马斯克抱怨 GPT-3 不够 Open,开源语言模型库来了你要不要学?
  11. w ndows10怎么联网,windows10所有uwp应用都无法联网的两种解决方法
  12. layui第三方插件引入_插件分享 | 可以进行web爬虫的Xray插件(文章末尾有福利)...
  13. mssql-sqlserver入门必备知识收集
  14. Screen Recorder for Mac屏幕录制软件
  15. 设为首页 加入收藏代码
  16. cad通过钢筋大样生成钢筋明细表插件_cad通过钢筋大样生成钢筋明细表插件_钢筋算量软件操作技巧汇总!!!...
  17. keras的net中使用tensorflow函数, AttributeError: ‘NoneType‘ object has no attribute ‘_inbound_nodes‘
  18. 网站徽章shields制作教程
  19. ThinkPHP 5.0 rewrite规则
  20. dllhell 听说过吗?_您已经听说过X25519,但是X448有何特别之处?

热门文章

  1. 电子技术学习实践DIY
  2. Android UI selector 例子 (drawable/color)
  3. JavaScriptCore API 和V8 API
  4. 学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot
  5. 学习笔记之-MySql高级之sql优化
  6. kotlin集合操作符——总数操作符
  7. WPF控件自定义样式(FasControls)
  8. Always keep in mind
  9. 《Unbroken》
  10. rails 构建 API