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预备知识)[通俗易懂]

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • pytest的assert_assert是什么意思

    pytest的assert_assert是什么意思前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

  • idea2022.2.4激活码(JetBrains全家桶)

    (idea2022.2.4激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • vue的$attrs_vue获取list集合中的对象

    vue的$attrs_vue获取list集合中的对象​说明本文用示例介绍Vue的$attrs和$listener的用法官网API—Vue.js$attrs和$listeners介绍Vue2.4中,引入了attrs和listeners,新增了inheritAttrs选项。$attrs:包含了父作用域中没有被prop接收的所有属性(不包含class和style属性)。可以通过v-bind=”$attrs”直接将这些属性传入内部组件。$

  • 剑指offer Java_工程图学基础知识点总结

    剑指offer Java_工程图学基础知识点总结线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建(类似于工厂设计模式),使用完毕不需要销毁线程而是返回池中,从而减少创建和销毁线程对象的开销。设计一个动态大小的线程池,如何设计,应该有哪些方法?线程管理器(ThreadPool)用于创建并管理线程池,包括创建线程,销毁线程池,添加新任务;工作线程(PoolWorker)线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;任务接口(Task)任务队列(TaskQueue)创建线程池。…

  • Java多线程常用面试题(含答案,精心总结整理)

    Java多线程常用面试题(含答案,精心总结整理)Java并发编程问题是面试过程中很容易遇到的问题,提前准备是解决问题的最好办法,将试题总结起来,时常查看会有奇效。现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。核心:thread.Jo

  • OpenCV相机标定全过程

    OpenCV相机标定全过程findChessboardCorners()棋盘格角点检测boolfindChessboardCorners(InputArrayimage, SizepatternSize, OutputArraycorners, intflags=CALIB_CB_ADAPTIVE_THRESH+ …

发表回复

您的电子邮箱地址不会被公开。

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