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)
上一篇 2022年2月16日 上午8:00
下一篇 2022年2月16日 上午9:00


相关推荐

  • pycharm如何执行高级撤销操作回到历史[通俗易懂]

    pycharm如何执行高级撤销操作回到历史[通俗易懂]今天写代码兴奋过头了,认为别人写得太麻烦,所以在看了这个人是要达成什么样的目标之后,把他的代码直接删了,然后自己重写,到后来发现有这样那样的问题,这个时候想参考原来的代码,可是为时已晚,已经是6,7个小时之前了,姑且不问能否一直使用低级撤销ctrl+z,就算可以,估计也要半个小时才能回到6,7个小时之前吧。这个时候,我悲从中来,悔恨自己在最开始的时候没有弄一个备份。但是,痛定思痛,发现了这一个撤销的高级操作,回退到历史,我以前在使用AndroidStudio的时候也有这个功能,所以试了试pycharm

    2022年8月26日
    8
  • nbtscan工具

    nbtscan工具这是一款用于扫描 Windows 网络上 NetBIOS 名字信息的程序 该程序对给出范围内的每一个地址发送 NetBIOS 状态查询 并且以易读的表格列出接收到的信息 对于每个响应的主机 NBTScan 列出它的 IP 地址 NetBIOS 计算机名 登录用户名和 MAC 地址 但只能用于局域网 NBTSCAN 可以取到 PC 的真实 IP 地址和 MAC 地址 如果有 ARP 攻击 在做怪 可以找到装有 ARP 攻击的 PC 的 IP 和 MA

    2026年3月26日
    2
  • 编程干货|10个超好用的python代码,短小且精悍,建议收藏!

    编程干货|10个超好用的python代码,短小且精悍,建议收藏!当今 python 编程语言的潮流已经成为不可阻挡的趋势 python 以其较高的可读性和简洁性备受程序员的喜爱 而 python 编程中的一些小的技巧 运用的恰当 会让你的程序事半功倍 以下的 10 个小的程序段 看似非常的简单 但是却非常的有技巧性 并且对个人的编程能力是一个很好的检验 大家应该在日常的编程中多多使用 多多练习 1 代码执行消耗时间利用 time 函数 在核心程序开始前记住当前时间点 然后在程序结束后计算当前时间点和核心程序开始前的时间差 可以帮助我们计算程序执行所消耗的时间 imp

    2025年11月3日
    3
  • hdfs 版本号_如何查看hadoop版本

    hdfs 版本号_如何查看hadoop版本展开全部通过在集群上执行 e58685e5aeb6 命令可以查看对应的 hadoop 的版本 查看 hadoop 集群的位数 执行 cd HADOOP HOME lib nativefileli so 1 0 0Hadoop 属于一个能够对大量数据进行分布式处理的软件

    2026年3月17日
    2
  • navicat for mysql如何导入sql文件_excel怎么把0显示出来

    navicat for mysql如何导入sql文件_excel怎么把0显示出来NavicatforMySQL导入excel文件_水里的鱼不会羡慕陆地爬行的动物-CSDN博客NavicatforMySQL是连接数据库的工具,可以更好地管理数据库。1.先连接连接名和主机名都是IP,本地连接名和主机名是localhost或127.0.0.1。-2.创建数据库及表表已经创建好了接下来就将含有学生信息的class.xls表导入到message表中2.1点击导入向导2.2表中我的数据放在sheet12.3这里我从第二行…

    2025年12月11日
    4
  • js Date 使用详解[通俗易懂]

    js Date 使用详解[通俗易懂]jsDate使用详解varmyDate=newDate();myDate.getYear();//获取当前年份(2位)myDate.getFullYear();//获取完整的年份

    2022年7月4日
    31

发表回复

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

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