33. bio和nio

news2024/11/24 14:41:00

文章目录

    • 一、bio网络模型
      • 1.1 bio网络模型示意图
      • 1.2 bio网络模型缺点
    • 二、NIO网络模型
      • 2.1 nio网络模型示意图
      • 2.2 nio网络模型的改进
    • 三、NIO核心- Channel(通道)
      • 3.1 Channel 简介
      • 3.2 Channel 实现类
      • 3.3 bio的socket 和 nio的channel代码实现
    • 四、NIO核心- buffer(缓冲区)
      • 4.1 buffer简介
      • 4.2 buffer属性
      • 4.3 buffer的API
    • 五、NIO核心- Select(选择器)
      • 5.1 简介
      • 5.2 核心API
      • 5.3 SelectionKey简介
    • 六、NIO编程实现步骤
    • 七、总结

一、bio网络模型

1.1 bio网络模型示意图

单个客户端向服务器发起请求时,请求顺序如下:
image

多个客户端向一个服务器发起请求时,请求顺序如下:
image

1.2 bio网络模型缺点

1.阻塞式I/O

服务器端的线程会因为阻塞I/O,一直阻塞,等待客户端的请求。
若客户端一直不发起,服务端的业务线程会一直存在。

2.弹性伸缩能力差

因为一个客户端对应一个服务端的业务线程,那么客户端和服务端线程数是1比1的关系,再好的机器也难以承受过多的线程。

3.多线程耗费资源

线程的创建销毁、大量的线程存在服务端,服务端的cpu调度资源都会存在影响

二、NIO网络模型

2.1 nio网络模型示意图

单个客户端向服务器发起请求时,请求顺序如下:
image

2.2 nio网络模型的改进

1.非阻塞式I/O

nio模型是基于非阻塞式I/O构建出来的,服务器端提供一个单线程的select,统一管理所有客户端接入的socket链接,并负责监听每个链接所关心的事件。

2.弹性伸缩能力强

因为服务端不是多个线程来处理,而是一个线程就可以处理所有请求,所有客户端和服务端线程数是1比N的关系,理论上可以接入无限的请求。

3.单线程节省资源

减少了线程的创建和销毁,以及线程上下文的切换问题。

三、NIO核心- Channel(通道)

3.1 Channel 简介

1.双向性

信息传输的通道,jdk的nio是对输入输出的方式的另一种抽象,类比bio中的流的概念。
不同的是流是单向传输,分输入流输出流。而通道支持双向传输,一个channel既可读又可写。

2.非阻塞性

传统流是阻塞模式,而channel可以工作在非阻塞模式下。

3.操作唯一性

操作channel的唯一方式是buffer,通过buffer操作channel实现数据块的回写

3.2 Channel 实现类

1.文件类 : FileChannel - 对文件进行读写的流 2.UDP类 :DatagramChannel - 用于UDP的数据读写 3.TCP类 : ServerSocketChannel/SocketChannel 基于TCP的数据读写

3.3 bio的socket 和 nio的channel代码实现

bio的socket代码实现逻辑
image

nio的channel代码实现逻辑
image

四、NIO核心- buffer(缓冲区)

4.1 buffer简介

作用 - 读写channel中的数据或者将数据写到channnel中。
本质 - 一块内存区域。这块内存能读数据,写数据,被nio封装成了一个buffer对象,提供了一系列API。

4.2 buffer属性

1.Capacity:容量 - 表明数组可以容纳多少字节,如果写入的字节数超过最大容量,那么需要清空后,才能继续往里面写入数据。
2.Position: 位置 - position表示当前位置,初始化为0,当一个byte写入后,position会移动到下一个可插入的数据单元。position最大可为容量减1
3.Limit:上限(写模式下) -limit表示最多能往buffer里写入多少数据,此模式下limit等于Capacity。
4.Limit:上限(读模式下) -limit表示最多能从buffer里读多少数据,这时limit会被设置成Position值
5.Mark:标记 - 表示一个特定的position位置,可以通过调用buffer的reset方法恢复到这个position位置。

4.3 buffer的API

1.初始化
image

2.写数据
image

3.写模式切换为读模式
image

4.读取一个字节
image

5.设置mark标记
image

6.回到标志位
image

7.重置属性
image

五、NIO核心- Select(选择器)

5.1 简介

1.作用 - I/O就绪选择
2.地位 - NIO网络编程的基础
3.定义 - select是java的nio中能够检测1到多个nio通道,并能够知晓通道是否为诸如读写事件做好准备的组件,通过他,一个单独的线程就可以管理多个channel,从而管理多个链接。

5.2 核心API

image

5.3 SelectionKey简介

1.四种就绪状态常量
    connect 连接就绪
    accept  接收就绪
    read    读就绪
    write   写就绪

六、NIO编程实现步骤

image
image
image

七、总结

image
image
image
image
image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“小小消防员 立志勇向前”未成年人就业创业意识技能指导培训活动

为培养未成年人沉着冷静处理突发事件的应变能力,提高未成年人的个人技能和社会实践能力,2023年7月13日,在吴忠市利通区民政局的支持指导下,吴忠市利通区新时代文明传播公益服务中心组织开展了“小小消防员 立志勇向前”—未成年人…

求根节点到叶节点数字之和

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。…

ubuntu22.0.4 tar命令不管用

问题: 解决方法:sudo tar sudo tar -zxvf flex-2.5.39.tar.gz不知道为什么需要sudo 去执行才可以正常工作。

关于电脑显示器屏幕看不出灰色,灰色和白色几乎一样无法区分,色彩调整方法

问题: 电脑显示器屏幕看不出灰色,灰色和白色几乎一样无法区分。白色和灰色有色差。 解决方法: 打开“控制面板” ->“色彩管理” ->“高级” ->“校正显示器” 在下一步调节中调成中间这一个实例的样子就可以了 进行微调&#x…

Java - Iterator迭代器

Iterator(迭代器) Iterator介绍 1、Iterator对象称为迭代器,主要用于遍历 Collection 集合中的元素 2、所有实现了Collection 接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器 3、Iterat…

我在VScode学Java类与对象(Java显式参数和隐式参数、静态方法+main方法、Java访问修饰符、static关键字、Java的包、对象数组)第三辑

我的个人博客主页:如果’真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习---->可以参考我的这篇博客:《我在VScode学Java》 续《我在VScode学Java(Java的类与对象)》 方法会操作对象并访问他们的实例字段。 伍._. 显式参…

springboot整合ehcache和redis实现多级缓存实战案例

一、概述 在实际的工作中,我们通常会使用多级缓存机制,将本地缓存和分布式缓存结合起来,从而提高系统性能和响应速度。本文通过springboot整合ehcache和redis实现多级缓存案例实战,从源码角度分析下多级缓存实现原理。 二、实战案…

STM32F407-- DMA使用

目录 1. DMA结构体 STM32F103: STM32F407: 2. F4系列实现存储器到存储器数据传输 1)结构体配置&初始化 2)主函数 补充知识点:关于变量存储的位置,关于内部存储器一般存储什么内容 3. F4系列实现…

Word 常用操作总结

文章目录 【公式篇】编号右对齐自动编号多行公式对齐编号右靠下编号右居中 公式引用更新编号 【公式篇】 简述:通过“#换行”的方式使编号右对齐,通过插入题注的方式使其自动编号,通过交叉引用的方式引用公式编号。 编号右对齐自动编号 在公…

【chrome】谷歌浏览器地址栏右侧“安装”按钮实现

这玩意学名叫PWA: 全称:Progressive Web App,是提升 Web App 的体验的一种新方法,能给用户原生应用的体验。 一、PWA安装条件: 在 Chrome 中,渐进式 Web 应用程序必须满足以下条件才能触发 beforeinstallpr…

session 生命周期和经典案例-防止非法进入管理页面

文章目录 session 生命周期和Session 经典案例-防止非法进入管理页面session 生命周期Session 生命周期-说明代码演示说明 Session 的生命周期创建CreateSession2创建ReadSession2 解读Session 的生命周期代码示例创建DeleteSession Session 经典案例-防止非法进入管理页面需求…

对接金蝶云星空,奥威软件SaaS BI能做的不止这一点

金蝶云星空提供了包括供应链管理、生产管理、销售与客户关系管理、人力资源管理、财务管理等功能,是一款基于云计算、大数据、人工智能等技术的商业智能软件服务。以云端数据可视化分析为主业的SaaS BI无一例外地提供了对接金蝶云星空数据源的路径,但接下…

你不能不知道的Word操作文本技巧!

在兽医诊所中,保持适宜的温湿度是非常重要的,因为动物的健康和舒适度受到环境条件的影响。 温度的控制对于动物的健康至关重要。过高或过低的温度可能会引起热应激或低体温等问题。适宜的温度范围有助于提供一个舒适的环境,促进动物的康复和治…

『CV学习笔记』ImportError: libGL.so.1和Dockerfile构建ubuntu18.04_miniconda_py37

ImportError: libGL.so.1: cannot open shared object file: No such file or directory 文章目录 一. opencv报错1.1. 解决办法11.2. 解决办法2二. Dockerfile文件(ubuntu18.04&miniconda_py37)一. opencv报错 容器报错内执行python程序报错ImportError: libGL.so.1: cann…

串口wifi6+蓝牙二合一系列模块选型参考和外围电路参考设计-WG236/WG237

针对物联网数据传输,智能控制等应用场景研发推出的高集成小尺寸串口WiFi串口蓝牙的二合一组合模块。WiFi符合802.11a/b/g/n无线标准,蓝牙支持低功耗蓝牙V4.2/V5.0 BLE/V2.1和EDR,WiFi部分的接口是UART,蓝牙部分是UART/PCM 接口。模…

又卡了,大数据平台容器化运维走起

文章目录 一、背景二、方案总结三、方案实施3.0 转移数据修改docker默认存储位置3.1 手动清理3.2 定时容器日志清理3.3 限制 Docker 容器日志大小 大家好,我是脚丫先生 (o^^o) 大数据基础平台的搭建,我采用的是全容器化Apache的大数据组件。 之前还很美…

基于协程和事件循环的c++网络库

完整资料进入【数字空间】查看——baidu搜索"writebug" 介绍 开发服务端程序的一个基本任务是处理并发连接,现在服务端网络编程处理并发连接主要有两种方式: 当“线程”很廉价时,一台机器上可以创建远高于CPU数目的“线程”。这时…

紧跟国家“新能源+”模式!涂鸦智慧能源方案助力夏季用电节能提效

“今天的你是几分熟?” 今年夏天,高温来得比往年更早,五六月份就提前开启了滚滚热浪模式,京津冀和山东等地最高气温也一度突破了历史极值。在提前到来的高温“烤”验下,全社会供电能力面临着极大挑战。 中国电力网预…

rce题目

<?php include "flag.php"; highlight_file(__FILE__); if(isset($_GET[HECTF])) { if (; preg_replace(/[^\W]\((?R)?\)/, NULL, $_GET[HECTF])) { if (!preg_match(/pos|high|op|na|info|dec|hex|oct|pi/i, $_GET[HECTF])) { eval(…