Java网络编程基础(Netty预备知识)[通俗易懂]

今天在家休息,闲来无事,写篇博客,陶冶下情操~~~我是分割线最近在重新学习Java网络编程基础,以便后续进行Netty的学习。整理了一下重要的基础知识点,供大家参考。正在读这篇随笔的你是否遇到

大家好,又见面了,我是全栈君。

今天在家休息,闲来无事,写篇博客,陶冶下情操~~~

=================我是分割线================

最近在重新学习Java网络编程基础,以便后续进行Netty的学习。

整理了一下重要的基础知识点,供大家参考。

正在读这篇随笔的你是否遇到过如下问题?

什么是BIO?什么是NIO?什么是AIO?什么是同步IO?什么是异步IO?什么是阻塞IO?什么是非阻塞IO?

为什么我感觉异步IO和非阻塞IO是一样的?

读完这篇随笔后相信大家就会明白了。

废话不多时,直接上干货。

一、阻塞IO和非阻塞IO、同步IO和异步IO

阻塞,通俗的说就是在干一件事情的时候不能干其他事情,直到当前正在干的事情完成为止。

一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。
同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO;如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。

也就是说发起IO请求之后不能再去发起别的请求,那就是阻塞,否则是非阻塞。

如果实际IO操作的时候进程不能进行其他实际操作,那就是同步;否则是异步(因为是OS在实际进行IO操作,OS操作的时候,进程还可以做其他事情)。

所以异步和非阻塞看上去都是在做一件事情的时候还能做别的事情,好像是一样的,但是却对应于IO操作的两个不同步骤。

另外,同步和异步说的是进程和进程(OS)之间;而阻塞和非阻塞说的是进程内部。

我们来举个通俗的例子:

你想吃金拱门了:
1.你点了份汉堡,然后在收银台前等着,还不停的问收银妹子“好了没啊,饿死了”-----同步阻塞
2.你点了份汉堡,然后找个位置坐下打起了王者农药,然后隔一会儿去问下收银妹子“好了没啊,饿死了”-----同步非阻塞
3.打王者农药的时候,收银台的妹子说汉堡好了,让你自己过去取-----异步阻塞
4.汉堡好了之后,收银台的妹子把做好的汉堡端给你-----异步非阻塞

IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、异步(AIO)。 

同步阻塞: 
在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式。 
同步非阻塞: 
在此种方式下,用户进程发起一个IO操作以后便可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。 
异步: 
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。”

———-以上内容参考了https://blog.csdn.net/u013851082/article/details/53942947

二、BIO、NIO、AIO

理解了同步和异步、阻塞和非阻塞之后我们来分别看下java的各种IO:

1.BIO(同步阻塞IO)

JDK1.4之前使用的IO操作,客户端通过Socket来实现,服务器端通过ServerSocket来实现;客户端和服务器通过一条inputStream和一个outputStream进行通信

Java网络编程基础(Netty预备知识)[通俗易懂]

从上图中可以看出每个客户端和服务器之间都会存在两条流,一个输入流一个输出流(图中是相对于客户端来说的,客户端的输入流就是服务器的输入流,客户端的输出流就是服务器的输入流)。

另外,服务器在和客户端1通信的时候不能同时和客户端2进行通信。

2.NIO(同步非阻塞IO)

JDK1.4之后开始使用NIO

NIO引入了三个概念:Selector(选择器,也叫多路复用器)、Buffer(缓冲区)、Channel(双向通道)。

Java NIO采用了channel进行数据传输,而不是单向的流(stream),channel中的数据是先写入缓冲然后处理,同样数据的读取也是到缓冲区里面去读。

在通道上可以注册我们感兴趣的事件。一共有以下四种事件:

服务端接收客户端连接事件 SelectionKey.OP_ACCEPT(16) 
客户端连接服务端事件 SelectionKey.OP_CONNECT(8)
读事件 SelectionKey.OP_READ(1)
写事件 SelectionKey.OP_WRITE(4)

服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。

selector用来轮询所有channel,用来发现就绪的channel。

 Java网络编程基础(Netty预备知识)[通俗易懂]

 

3.AIO(异步IO)

 JDK 1.7中开始引入AIO,也就是NIO 2.0。AIO引入新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。

 

三、三种I/O的对比:

在网上看到一张图,分享一下

Java网络编程基础(Netty预备知识)[通俗易懂]

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120911.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于豆瓣影评数据的文本分析系统【数据爬取+数据清洗+数据库存储+LDA主题挖掘+词云可视化】「建议收藏」

    基于豆瓣影评数据的文本分析系统【数据爬取+数据清洗+数据库存储+LDA主题挖掘+词云可视化】「建议收藏」本分析中很多的工作都是基于评论数据来进行的,比如:滴滴出行的评价数据、租房的评价数据、电影的评论数据等等,从这些语料数据中能够挖掘出来客户群体对于某种事物或者事情的看法,较为常见的工作有:舆情分析、热点挖掘和情感分析。如果想要了解关于文本分类或者是情感分析相关的工作内容,可以阅读我的《数据建模实战》专栏文章,下面是链接信息:…

    2022年5月10日
  • 应用date函数读取系统当前时间_获取系统时间的代码

    应用date函数读取系统当前时间_获取系统时间的代码在c#/ASP.net中我们可以通过使用DataTime这个类来获取当前的时间。通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期+时间(2008-09-0412:11:10)等。//获取日期+时间 DateTime.Now.ToString();//2008-9-420:02:10 DateTime.Now.ToLo…

    2022年8月31日
  • 取反是什么意思_1取反是多少

    取反是什么意思_1取反是多少很多编程语言使用~作为一元按位取反(NOT)操作符,Go重用^XOR操作符来按位取反://错误的取反操作funcmain(){fmt.Println(~2)//bitwisecomplementoperatoris^}//正确示例funcmain(){varduint8=2fmt.Printf(“%08b\n”,d)//00000010fmt.Printf(“%08b\n”

    2022年8月14日
  • 51单片机最小系统原理图、PCB及组成原理详解「建议收藏」

    51单片机最小系统原理图、PCB及组成原理详解「建议收藏」单片机:单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。先上原理图和PCB,原理介绍…

    2022年6月2日
  • 无刷直流电动机驱动控制系统_直流无刷电机驱动电路

    无刷直流电动机驱动控制系统_直流无刷电机驱动电路无刷直流电动机利用电子开关线路和位置传感器来代替有刷直流电机电刷和换向器,使其同时具有直流电动机和交流电动机的优良特性。无刷直流电机(驱动系统)主要由电动机本体、位置传感器、电子开关线路三部分组成。

    2022年10月21日
  • python中的补码

    python中的补码

    2020年11月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号