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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 无显示屏 配置树莓派教程[通俗易懂]

    无显示屏 配置树莓派教程[通俗易懂]<无显示屏>配置树莓派教程0.相关链接#SDCardFormatter官网下载链接https://www.sdcard.org/downloads/formatter/eula_windows/index.html#Win32DiskImager下载链接https://sourceforge.net/projects/win32diskimager/#树莓派…

    2022年8月31日
    10
  • oracle用户修改密码权限_oracle提示表或视图不存在

    oracle用户修改密码权限_oracle提示表或视图不存在今天想要修改一个用户的密码,但是在执行完alteruser语句后,提示用户不存在。查看dba_users视图后,该用户的确是存在的,但是注意到一个细节是用户名是小写的,其他的用户名都是大写。在群内咨询过大神后,原来是在创建用户时,把用户名用双引号包起来了,如果没有用双引号,数据库会自动将用户名改为大写,但是用了双引号后,则保持小写。解决方法为,若创建过程用引号包起来,则在后续的使用过程中,也需要

    2022年7月28日
    4
  • 苹果x充电慢是什么原因_苹果手机充不进去电?什么原因?怎么解决?

    突然发现苹果手机充不进电了?难道是手机坏了?还是其它方面的原因呢?今天蜜罐蚁小编给大家介绍一个有关苹果手机使用方面生活小妙招。下面是几种常见苹果手机充不进电原因总结。1、充电线损坏不知道是不是有一些朋友像小编一样,家里的苹果手机原装充电线早就找不到了,从网上买的数据线,结果这种网上买的数据线不耐用,用了几次发现就不好用了,怎么充电都没反应。这种情况就只能更换一根新的数据线了。2、充电器损坏其实这个…

    2022年4月7日
    330
  • mysql中字符转数字,MYSQL字符数字转换为数字「建议收藏」

    mysql中字符转数字,MYSQL字符数字转换为数字「建议收藏」1、将字符的数字转成数字,比如’0’转成0可以直接用加法来实现例如:将user表中的uid进行排序,可uid的定义为varchar,可以这样解决select*fromuserorderby(uid+0)2、在进行ifnull处理时,比如ifnull(a/b,’0′)这样就会导致a/b成了字符串,因此需要把’0’改成0,即可解决此困扰3、比较数字和varchar时,比如a=11,…

    2022年5月7日
    46
  • ASP.NET MVC4开发指南_安装.net framework

    ASP.NET MVC4开发指南_安装.net framework安装AspNetMVC1-RC2出错,错误提示如下:MicrosoftASP.NETMVC1.0RC2SetupWizardendedprematurelyMicrosoftASP.NETMVC1.0RC2SetupWizardendedprematurelybecauseofanerror.Yoursystemhasnotbee…

    2022年9月29日
    4
  • python3 基础 廖雪峰教程笔记-1

    python3 基础 廖雪峰教程笔记-1廖雪峰教程文档:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143252

    2022年7月6日
    21

发表回复

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

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