在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念

一、阻塞和非阻塞

从简单的开始,我们以经典的读取文件的模型举例。(对操作系统而言,所有的输入输出设备都被抽象成文件。)在发起读取文件的请求时,应用层会调用系统内核的I/O接口。

如果应用层调用的是阻塞型I/O,那么在调用之后,应用层即刻被挂起,一直出于等待数据返回的状态,直到系统内核从磁盘读取完数据并返回给应用层,应用层才用获得的数据进行接下来的其他操作。

如果应用层调用的是非阻塞I/O,那么调用后,系统内核会立即返回(虽然还没有文件内容的数据),应用层并不会被挂起,它可以做其他任意它想做的操作。(至于文件内容数据如何返回给应用层,这已经超出了阻塞和非阻塞的辨别范畴。)

这便是(脱离同步和异步来说之后)阻塞和非阻塞的区别。总结来说,是否是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态。被挂起无法执行其他操作的则是阻塞型的,可以被立即「抽离」去完成其他「任务」的则是非阻塞型的。

二、同步和异步

阻塞和非阻塞解决了应用层等待数据返回时的状态问题,那系统内核获取到的数据到底如何返回给应用层呢?这里不同类型的操作便体现的是同步和异步的区别。

对于同步型的调用,应用层需要自己去向系统内核问询,如果数据还未读取完毕,那此时读取文件的任务还未完成,应用层根据其阻塞和非阻塞的划分,或挂起或去做其他事情(所以同步和异步并不决定其等待数据返回时的状态);如果数据已经读取完毕,那此时系统内核将数据返回给应用层,应用层即可以用取得的数据做其他相关的事情。

而对于异步型的调用,应用层无需主动向系统内核问询,在系统内核读取完文件数据之后,会主动通知应用层数据已经读取完毕,此时应用层即可以接收系统内核返回过来的数据,再做其他事情。

这便是(脱离阻塞和非阻塞来说之后)同步和异步的区别。也就是说,是否是同步还是异步,关注的是任务完成时消息通知的方式。由调用方盲目主动问询的方式是同步调用,由被调用方主动通知调用方任务已完成的方式是异步调用。

三、Java 网络通信

3.1 基本概念

在Java网络通信中,最基本的概念就是Socket编程了。Socket又称“套接字” 向网络发出请求或者应答网络请求。

Socket 和ServerSocket类库位于Java.net 包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Scoket实例,操作这个实例,完成所需要的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或者在客户端而产生不同的级别。不管是Socket还是ServerSocket他们的工作都是通过SocketImpl类及其子类完成的。

套接字之间的连接过程可以分为四个步骤:服务器监听,客户端请求服务器,服务器确认,客户端确认,进行通信。

1)服务器监听:是服务器套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

2)服务器请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描叙它要连接的服务器的套接字,指出服务器的套接字的地址和端口,然后就像服务器套接字提出连接请求。

3)服务器连接确认:是指当服务器套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端的套接字的描述发送给客户端。

4)客户端连接确认:一旦客户端确认了此描叙,连接就建立完成了,双方开始通信。而服务器套接字继续处于监听状态;继续接受其他网络套接字的连接请求。

3.2 阻塞和非阻塞

阻塞:应用程序在获取网络数据的时候,如果程序传输数据很慢,那么程序就一直等待着,直到数据传输完成。

非阻塞:应用程序直接可以获取已经准备就绪的数据, 无须等待。

BIO和NIO的本质区别就是阻塞和非阻塞。

3.3 同步和异步

同步和异步一般是面向操作系统与应用程序对I/O操作的层面上区别的。

同步:应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某个方法上,直到数据准备完毕。

异步:所有的IO操作交个操作系统处理,与我们应用程序没有直接关系,我们程序不需要关系IO读写,当操作系统完成了 IO读写的时候,会给我们应用程序发出通知,数据传输完毕。

3.4 在Java网络通信中同步和异步 阻塞和非阻塞

同步异步说的是Server服务器端的执行方式。

阻塞和非阻塞说的就是接受数据的方式。

BIO为同步阻塞模式,NIO为同步非阻塞。NIO并没有实现异步,在JDK1.7以后,升级了NIO库包,指出异步非阻塞通信模式NIO 2.0(AIO)。

NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞相关推荐

  1. python股票网格交易法详解_干货 | 浅谈网格交易法

    原标题:干货 | 浅谈网格交易法 网格交易法的基本原理就是把行情的所有日间上下的波动全部囊括,它不会放过任何一次的行情上下波动. 不管市场价格如何上下波动,不外3种形态:上涨,盘整,下跌.由于不同的操 ...

  2. python进阶04IO的同步异步,阻塞非阻塞

    原创博客地址:python进阶04IO的同步异步,阻塞非阻塞 同步和异步 同步和异步关注的是消息通信机制. 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就得到 ...

  3. Java基础——Java NIO详解(二)

    一.简介 在我的上一篇文章Java NIO详解(一)中介绍了关于标准输入输出NIO相关知识, 本篇将重点介绍基于网络编程NIO(异步IO). 二.异步IO 异步 I/O 是一种没有阻塞地读写数据的方法 ...

  4. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  5. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...

  6. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  7. OS--进程间通信详解(二)

    OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...

  8. cpu 被挂起和阻塞_迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  9. Java基础——Java NIO详解(一)

    一.基本概念 1.I/0简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过str ...

最新文章

  1. 不使用框架的web项目中配置log4j
  2. 纪念互联网第一本众筹电子书Mycat权威指南获得成功
  3. 52条实用经验,SQL优化不再难!
  4. okhttp_utils的使用以及与服务端springboot交互中遇到的问题
  5. 快速解决MariaDB无密码就可以登录的问题
  6. app开发的三大技术框架
  7. 机器人顶会RSS 2021各奖项出炉,CMU华人博士生摘得最佳论文
  8. 【读书笔记】李彦宏传-张丽,学霸李彦宏:北大信管+留学纽约州立大学+百度创始人
  9. ADF单位根检验三种形式_【EViews】面板数据的处理方法及检验步骤
  10. IOS越狱运行Linux,iOS 13.4.1 Linux 简易越狱,重启就能打开
  11. python打包成exe fail to ex_使用python写的PDF转EXCEL工具,已打包exe
  12. html5css字竖着显示,css如何设置竖排文字?
  13. Python贪吃蛇双人大战
  14. Uplift Model
  15. SlicePlane的Heading角度与Math.atan2(y,x)的对应转换关系
  16. pytorch2-gym
  17. 零知识证明笔记The 9th BIU Winter School on Cryptography
  18. “===”、“==” 的区别
  19. 关于程序员工作 交接的一些注意事项
  20. 树莓派研究笔记(10)-- Retropie 模拟器

热门文章

  1. springboot 自动配置
  2. Windows系统下如何在cmd命令窗口中切换Python2.7和Python3.6
  3. Linux入门之运维(1) 系统监控 vmstat top
  4. Java 8特性有望进入.Net/Mono
  5. HDU-1212 Big Number JAVA又出毛病了
  6. c++对vector中的元素进行随机排序
  7. 国家卫健委:我国男女性成人平均身高分别为169.7厘米和158厘米
  8. php支付宝h5 app,H5网站接入支付宝的支付接口
  9. python学习面向对象_python学习之面向对象学习
  10. jdk jre jvm三者之间的关系