网络编程:IO 通信模型—BIO&NIO|学习笔记

简介: 快速学习网络编程:IO 通信模型—BIO&NIO

开发者学堂课程【大数据 ZooKeeper 快速入门 网络编程:IO 通信模型—BIO&;NIO】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/549/detail/7583


网络编程:IO 通信模型—BIO&;NIO


内容介绍

一、IO 通信模型

二、BIO (阻塞模式)

三、NIO(非阻塞模式)

 

一、IO 通信模型

网络通信的本质是网络间的数据IO。只要有I0,就会有阻塞或非阻塞的问题,无论这个 IO 是网络的,还是硬盘的。原因在于程序是运行在系统之上的,任何形式的 I0 操作发起都需要系统的支持。

网络通信本质上是两台机器之间的数据传输,也就是数据的 IO,I 表示 input,O 表示 output。有了输入和输出才构成通信的本质。

 

二、BIO(阻塞模式)

BIO 即 blocking I0,是一种阻塞式的I0。

jdkl.4版本之前 Socket 即 BIO 模式。

Socket 编程中,在服务端设置了 Socket 的启动后有一个方法叫 accept()方法,监听客户端有没有请求链接,因此是一个阻塞的。

如果用 read 方法去读数据,客户端不发送数据,那么 read 方法也会阻塞,因此这两个方法都是所谓的阻塞点。

BIO 的问题在于 accept()、 read )的操作点都是被阻塞的。

服务器线程发起一个 accept 动作,按照通常的理解认为是直接去监听端口,监听一下有没有客户端 socket 方法发生链接请求,实际上询问操作系统是否有新的 socket 信息从端口 X 发送过来。

注意,是询问操作系统,因为任何请求都需要操作系统的支持。

如果有就相应生成 socket 进行通信,如果操作系统没有发现有 socket 从指定的端口X来,那么操作系统就会等待。这样 serverSocket. accept() 方法就会一直等待。这就是为什么 accept() 方法为什么会阻塞。

如果想让 BIO 同时处理多个客户端请求,就必须使用多线程,即每次 accept 阻塞等待来自客户端请求,一旦收到连接请求就建立通信,同时开启一个新的线程来处理这个套接字的数据读写请求,然后立刻又继续accept等待其他客户端连接请求,即为每一个客户端连接请求都创建一个线程来单独处理。

image.png

比如现在有一个客户端发送了一个连接请求,服务端 socket 通过操作系统感受到这个连接请求,然后就会接收,接收后 new 一个新的线程生成一个 socket 完成通信,之后主线程 accept()返回来继续等待新的连接请求。

通过这种方式可以在某种更程度上提高 BIO 编程模型效率,不管有多少个客户端连接请求,服务端都去接收,接收后生成相应的线程完成通信。

虽然每一个 socket 都以一个线程相对应,还有有阻塞点存在,也就是说 accept ()接收时还是一个一个接收。

比如当这三个客户端同时发起连接请求,accept()只能同时处理一个,接收一个new 一个线程,所以 BIO 模式多线程可以在某种上提高效率,但还没有彻底改变,因此把 BIO 叫做阻塞模式。

 

三、NIO(非阻塞模式)

NIO 即 non-blocking I0,是一种非阻塞式的 I0。jdk1.4 之后提供。

NIO 三大核心部分:Channel(通道),Buffer(缓冲区),Selector(选择器)。

Buffer:容器对象,包含一些要写入或者读出的数据。

在 NIO 库,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的;在写入数据时,也是写入到缓冲区中。

任何时候访问 NI0 中的数据,都是通过缓冲区进行操作。

在 NIO 模式下写数据要写在 buffer 容器中,读取数据也要从 buffer 容器中读取。不在直接面对数据,而是直接面对容器对象 buffer,在 buffer 存在所需要的数据。因此把 buffer 叫做缓冲区,是数据接触的直接点。

Channel:通道对象,对数据的读取和写入要通过 Channel,它就像水管一样。通道不同于流的地方就是通道是双向的,可以用于读、写和同时读写操作。Channel 不会直接处理字节数据,而是通过 Buffer 对象来处理数据。

在水管中数据既可以输入,也可以输出,也就是说它的传输是双向的,不管是传统的 inputsream 还是 outputstream 都是单方向的,inputsream 只能往里面读取数据,outputstream 只能往外写数据。

Channel 里面不会直接存放数据,结合 buffer 特点,应该在 Channel 中传输的是一个个容器对象 buffer,buffer 里包装着各种各样的数据。

Selector:多路复用器,选择器。提供选择已经就绪的任务的能力。

Selector会不断轮询注册在其上的 Channel,如果某个 Channel 上面发生读或者写事件,这个 Channel 就处于就绪状态,会被 Selector 轮询出来,进行后续的 I/0 操作。

这样服务器只需要一两个线程就可以进行多客户端通信。

 image.png

在 NIO 编程模式下,数据两方不在直接接触,比如 thread 上面是一个服务端线程,下面各个客户端要想和 thread 进行数据通信,首先需要在 selector 注册 channel,这里可以将 selector 理解为服务端管家,不按时不管是什么客户端建立什么通信,首先现在 selector 注册 channel。之后逐个轮询各个 channel。

比如一个 channel 已经准备好了,那么 selector 选择器就可以将它选择出来将它与服务端之间的通道打开,因为 selector 具备选择已经准备就绪的任务的能力。

在这种模式下想要满足多线程模式通信,只需要在客户端简单的一两个线程就可以,因为服务端不在与客户端直接通信,而是通过 selector 进行通信。

相关文章
|
2月前
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
|
16天前
|
Java
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
|
2月前
|
缓存 Java UED
BIO、NIO、AIO有什么区别
【8月更文挑战第16天】BIO、NIO、AIO有什么区别
41 4
|
2月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
42 2
|
2月前
|
机器学习/深度学习 自然语言处理 并行计算
【深度学习+面经】Transformer 网络学习笔记
Transformer模型的核心概念、优缺点以及在多个领域的应用,并提供了针对Transformer架构的面试问题及答案。
95 2
|
3月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
139 1
|
3月前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
|
3天前
|
SQL 安全 算法
网络安全与信息安全的全面解析:应对漏洞、加密技术及提升安全意识的策略
本文深入探讨了网络安全和信息安全的重要性,详细分析了常见的网络安全漏洞以及其利用方式,介绍了当前流行的加密技术及其应用,并强调了培养良好安全意识的必要性。通过综合运用这些策略,可以有效提升个人和企业的网络安全防护水平。
|
4天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益严重。本文将从网络安全漏洞、加密技术和安全意识三个方面,探讨如何保护个人信息和网络安全。我们将通过实例分析,了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术防止数据泄露。同时,我们还将讨论提高个人和企业的安全意识的重要性。
|
3天前
|
安全 网络安全 区块链
网络安全与信息安全:构建数字世界的防线在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的重要屏障。随着网络攻击手段的不断升级,从社交工程到先进的持续性威胁(APT),我们必须采取更加严密的防护措施。本文将深入探讨网络安全漏洞的形成原因、加密技术的应用以及提高公众安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
在这个数字信息日益膨胀的时代,网络安全问题成为了每一个网民不可忽视的重大议题。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全漏洞如同隐藏在暗处的“黑洞”,时刻准备吞噬掉我们的信息安全。而加密技术作为守护网络安全的重要工具之一,其重要性不言而喻。同时,提高公众的安全意识,也是防范网络风险的关键所在。本文将从网络安全漏洞的定义及成因出发,解析当前主流的加密技术,并强调提升安全意识的必要性,为读者提供一份详尽的网络安全指南。