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


相关推荐

  • SSTI基础学习

    SSTI基础学习一 什么是 SSTISSTI 就是服务器端模板注入 Server SideTemplate 也给出了一个注入的概念 常见的注入有 SQL 注入 XSS 注入 XPATH 注入 XML 注入 代码注入 命令注入等等 SSTI 也是注入类的漏洞 其成因其实是可以类比于 sql 注入的 sql 注入是从用户获得一个输入 然后又后端脚本语言进行数据库查询 所以可以利用输入来拼接我们想要的 sql 语句 当然现在的 sql 注入防范做得已经很好了 然而随之而来的是更多的漏洞 SSTI 也是获取了一个输入 然后再后

    2026年3月26日
    2
  • 软考/软件设计师资料真题/软件设计师教程

    软考/软件设计师资料真题/软件设计师教程软件设计师学习资料

    2026年3月18日
    2
  • Perl正则表达式讲解「建议收藏」

    Perl正则表达式讲解「建议收藏」9.3.1原则1正则表达式有三种形式:匹配、替换和转换。在表 9-1 中列有三种正则表达式运算符。接下来对每一个表达式给出详尽解释。匹配:m//这种形式表明在//内部的正则表达将用于匹配 = ~或 !~左边的标量。为了语法上的简化用//,略去m。替换:s///这种形式表明正则表达式将被文本替换,为了语法的简化用//略去s。·转换:tr///这种形式包含一系列的字符

    2022年5月31日
    73
  • paho mqtt java_MQTT JAVA paho实例

    paho mqtt java_MQTT JAVA paho实例packagecom chen mqtt mosquitto importorg eclipse paho client mqttv3 importorg eclipse paho client mqttv3 persist MemoryPersis author ChenJie date2018 8 10 publicclassP

    2026年3月17日
    3
  • django3.0异步_java定时任务框架选型

    django3.0异步_java定时任务框架选型celery介绍Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。Celery侧重

    2022年7月29日
    11
  • Java实现字符串逆序输出

    Java实现字符串逆序输出【题目描述】写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。【输入】一行字符【输出】逆序后的字符串【样例输入】123456abcdef【样例输出】fedcba654321 【解题思路】首先定义两个String字符串a,b,其中a用于存放正序的字符串,b用于存放逆序的字符串,然后在定义一个字符数组c,然后调用类库中的t…

    2022年7月16日
    21

发表回复

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

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