NIO基础

nio :  non-blocking io 非阻塞IO

1. 三大组件

1.1 channel和buffer

channel 有点像stream ,他就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer的数据写入channel,之前的stream 要么输入,要么输出;channel 比stream更加底层  。

常见的channel
  1. FileChannel:用于文件的读取和写入操作。可以从文件中读取数据到缓冲区,也可以将数据从缓冲区写入文件。

  2. SocketChannel:用于通过TCP协议进行网络通信。可以连接到远程服务器并发送和接收数据。

  3. ServerSocketChannel:用于监听TCP连接请求。可以接受来自客户端的连接请求,并创建对应的SocketChannel进行通信。

  4. DatagramChannel:用于通过UDP协议进行网络通信。可以发送和接收UDP数据包。

这些Channel的功能主要包括:

  • 读取数据:可以从Channel中读取数据到缓冲区,供后续处理使用。

  • 写入数据:可以将数据从缓冲区写入到Channel中,发送给对应的目标。

  • 非阻塞模式:可以将Channel设置为非阻塞模式,以便在没有数据可读或可写时立即返回,而不是一直等待。

  • 文件操作:FileChannel可以进行文件的读取和写入操作,包括读取文件内容、写入文件内容、文件的位置操作等。

  • 网络通信:SocketChannel和ServerSocketChannel可以进行网络通信,包括连接远程服务器、发送和接收数据等。

这些Channel提供了更高级别的IO操作,相比于传统的InputStream和OutputStream,更加灵活和高效。通过使用这些Channel,可以实现更好的IO性能和更多的IO操作控制。

        buffer 不多多赘述

Buffer对象具有以下几个重要的属性和方法:

  • 容量(Capacity):表示Buffer的最大容量,即它可以存储的最大数据量。

  • 位置(Position):表示当前读写的位置,初始位置为0。

  • 限制(Limit):表示有效数据的末尾位置,初始限制为容量。

  • 标记(Mark):用于临时存储位置的标记,可以通过调用mark()方法设置标记,通过调用reset()方法恢复到标记位置。

  • 读写操作:可以通过put()方法将数据写入Buffer,通过get()方法从Buffer中读取数据。

  • 翻转(Flip):将Buffer从写模式切换到读模式,即将限制设置为当前位置,位置设置为0。

  • 清空(Clear):将Buffer从读模式切换到写模式,即将位置和限制都设置为容量。

  • 压缩(Compact):将未读取的数据复制到Buffer的起始位置,然后将位置设置为未读取数据的末尾。

Buffer提供了一种方便的方式来处理数据,可以通过读写操作来操作Buffer中的数据,并且可以通过翻转、清空等方法来控制读写的位置和限制。在NIO中,Buffer与Channel配合使用,可以实现高效的数据读写操作。

Selector

selector但从字面意思上不好理解,接下来需要结合服务器的设计演化来理解它的用途

多线程版设计

        缺点:连接数一多就不行了,大量数据来了,就会创建大量thread,到一定程度会造成oom。

而且线程上下文切换开销也会增大。因为你这个多线程我这个几个cpu吃不住。

线程池版设计

          虽然避免了oom ,降低了上下文切换的开销。但是他是在阻塞模式下工作的,就好比你的线程池里的一个线程,只能等待服务完一个socket之后才能服务完另一个socket。所以他只适合短链接的场景。

selector版的设计

selector 的作用就是配合一个线程来管理多个channel,获取这些channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流暴低的场景 (low traffic)

调用selector 的select0 会阻塞直到channel 发生了读亏就緒事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理

讲个小案例就是说 selector好比服务员 ,channel 好比客人。channelA把服务员selector说了我来一份饺子 ,又说我在想想,与此同时channelB说我来个包子,这时候selector不会等着A,而是转头给B一个包子。但是a是个吃货我要这个还要哪个等等 这时候channel会一直服务a,但如果a说我在想想还要啥,selector就去服务其他客人了。  这就是非阻塞的去处理事件

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

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

相关文章

建筑能源管理(3)——建筑能源监管

为了全面落实科学发展观,提高建筑能源管理水平,进一步降低能源和水资源消耗、合理利用资源,以政府办公建筑和大型公共建筑的运行节能管理为突破口,建立了既有政府办公建筑和大型公共建筑运行节能监管体系,旨在提高政府…

28271-2012 米制超细牙螺纹 公差

声明 本文是学习GB-T 28271-2012 米制超细牙螺纹 公差. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了米制超细牙螺纹的公差和标记。 本标准适用于精密仪器和电子设备等领域的螺纹连接。 2 规范性引用文件 下列文件对于本文件…

windows server 2019 、win11安装docker desktop

Docker Desktop Docker Desktop是可以部署在windows运行docker的应用服务,其基于windos的Hyper-V服务和WSL2内核在windos上创建一个子系统(linux),从而实现其在windows上运行docker。 前提条件 WSL 查看wsl是否安装 我们可以直接在 cmd 或 powershe…

MySql出错点

一、DDL 1.修改表,添加新的字段时,不要加引号 2.在修改表中字段的类型时,会发生数据截断。 像DATETIME 转化为 TIME 二、DML 1.插入和删除的注意点 2.可以通过 select 来协助插入 3.

Linux 基本语句_4_指针和函数

指针函数 顾名思义&#xff0c;即返回值为指针的函数 int * f (int n){int *p NULL;//空指针return p;//返回一个地址 }函数指针 指向函数的指针&#xff0c;每个函数都有自己的入口地址&#xff0c;函数指针专门指向这些地址#include <stdio.h>int max(int a, int b)…

【Linux】完美解决ubuntu18.04下vi不能使用方向键和退格键

今天在刚安装完ubuntu18.04&#xff0c;发现在使用vi命令配置文件时使用方向键并不能移动光标&#xff0c;而是出现一堆奇怪的英文字母&#xff0c;使用退格键也不能正常地删除内容&#xff0c;用惯了CentOS的我已经感觉到ubuntu没有centos用着丝滑&#xff0c;但是没办法&…

【C++】类和对象(中)

一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。但是空类中并不是真的什么都没有&#xff0c;任何类在什么都不写的时候&#xff0c;编译器会自动生成以下 6 个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成…

5G消息发展的前景与挑战

随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 5G消息发展呈现规模化、产业化趋势 自2020年4月国内三大运营商联合发布5G消息白皮书以来&#xff0c;已经过…

【C语言】通讯录系统实现 (保姆级教程,附源码)

目录 1、通讯录系统介绍 2、代码分装 3、代码实现步骤 3.1、制作菜单menu函数以及游戏运行逻辑流程 3.2、封装人的信息PeoInfo以及通讯录Contact结构体类型 3.3、初始化通讯录InitContact函数 3.4、增加联系人AddContact函数 3.5、显示所有联系人ShowContact函数 3.6、…

【Idea】idea、datagrip设置输入法

https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/releases/tag/jbr-release-17.0.6b829.5https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/releases/tag/jbr-release-17.0.6b829.5 下载后解压并重命名为 jbr, 然后替换对应 ide…

CTF-XSS

知识 例子 。2022 CNSS夏令营 To_be_Admin_Again_and_Again XSS攻击. 与admin有关, 可以尝试http://1.117.6.207:65005/admin, 显示Get out, HACKER! Only admin can see the flag!, 说明需要一个admin的验证, 这里想到获取admin的cookie. 每条留言会自动查看, 可以使用XS…

Python-Flask:编写自动化连接demo脚本:v1.0.0

主函数&#xff1a; # _*_ Coding : UTF-8 _*_ # Time : 13:14 # Author : YYZ # File : Flask # Project : Python_Project_爬虫 import jsonfrom flask import Flask,request,jsonify import sshapi Flask(__name__)# methods: 指定请求方式 接口解析参数host host_info[…

TSM动作识别模型【详解】

文章目录 本文使用的是somethingv2数据集&#xff0c;解压后是如下形式&#xff1b; 由于该压缩数据进行了分卷操作&#xff0c;需要合并后才能进行解压。首先我们将下面4个json文件剪贴到其他文件夹&#xff0c;只保留00-19的文件&#xff0c;然后在该文件夹下打开cmd&#xf…

模块化CSS

1、什么是模块化CSS 模块化CSS是一种将CSS样式表的规则和样式定义封装到模块或组件级别的方法&#xff0c;以便于更好地管理、维护和组织样式代码。这种方法通过将样式与特定的HTML元素或组件相关联&#xff0c;提供了一种更具可维护性、可复用性和隔离性的方式来处理样式。简单…

机器人制作开源方案 | 四轴飞行器

1. 概述 基于探索者搭建的模块化四轴飞行器研究平台&#xff0c;采用独特的设计方式&#xff0c;可实现在室内完成对四轴飞行器、无人机等运动控制的原理研究&#xff0c;以及学习飞行控制的原理知识。 2. 组装 请按照下图进行机架的组装。 整体图 请解压文末资料中的 /软件/Mi…

【LeetCode热题100】--226.翻转二叉树

226.翻转二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

【聊天系统的优化】RPC方式的优化

RPC方式的优化 聊天系统的中RPC的选择Jsonprotobufmsgpack 聊天系统的中RPC的选择 在RPC方式中&#xff0c;常用的三种方式&#xff1a;Json&#xff0c;protobuf&#xff0c;Msgback 设定一个简单的加和服务&#xff0c;客户端发送一个list给服务端&#xff0c;需要将list的…

QT的ui设计中改变样式表的用法

在QT的ui设计中,我们右键会弹出一个改变样式表的选项,很多人不知道这个是干什么的。 首先我们来看下具体的界面 首先我们说一下这个功能具体是干嘛的, 我们在设置很多控件在界面上之后,常常都是使用系统默认的样式,但是当有些时候为了美化界面我们需要对一些控件进行美化…

Kafka-Kerberos票据刷新问题

线上kafka使用了 kerberos 认证&#xff0c;每隔24小时&#xff0c;票据过期&#xff0c;无法自动续期&#xff0c;出现消息发送失败问题。 从日志可以发现会有如下报错&#xff1a; 2023-09-14 17:48:47,144 [kafka-kerberos-refresh-thread-kafka/hdp-1HADOOP.COM] [] WARN …

Kafka(一)使用Docker Compose安装单机Kafka以及Kafka UI

文章目录 Kafka中涉及到的术语Kafka镜像选择Kafka UI镜像选择Docker Compose文件Kafka配置项说明KRaft vs Zookeeper和KRaft有关的配置关于Controller和Broker的概念解释Listener的各种配置 Kafka UI配置项说明 测试Kafka集群Docker Compose示例配置 Kafka中涉及到的术语 对于…