第六课:NIO简介

2024-03-02 21:04
文章标签 nio 简介 第六课

本文主要是介绍第六课:NIO简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、传统BIO的缺点

BIO属于同步阻塞行IO,在服务器的实现模型为,每一个连接都要对应一个线程。当客户端有连接请求的时候,服务器端需要启动一个新的线程与之对应处理,这个模型有很多缺陷。当客户端不做出进一步IO请求的时候,服务器端的线程就只能挂着,不能去处理其他请求。这样会对造成不必要的线程开销。

二、阻塞与同步

同步和异步都是由基于应用程序和操作系统处理IO事件所采用的方式所决定的。
在这里插入图片描述
阻塞和非阻塞式指线程在得到调用结果之前是否被挂起,主要针对线程。
在这里插入图片描述

三、NIO简介(同步非阻塞)

  • Java NIO全称java non-blocking IO, 是指JDK提供的新API。从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(即New IO),是同步非阻塞的。
  • NIO是一种面向缓冲区的、基于通道的IO操作,NIO有三大核心部分: Channel(通道), Buffer(缓冲区),Selector(选择器)
  • java NIO的运行模式是:客户端发送的链接请求都会被注册到Selector(选择器)上,多路复用器轮询到有I/O请求时才会启动一个线程去服务。

四、NIO三大核心原理

NIO有三大核心部分: Channel(通道), Buffer(缓冲区),Selector(选择器)
Buffer(缓冲区)
缓冲区本质上就是一块内存,数据的读写都是通过Buffer类实现的。缓冲区buffer主要是和通道数据交互,即从通道中读入数据到缓冲区,和从缓冲区中把数据写入到通道中,通过这样完成对数据的传输。
Channel(通道)
java NIO的类似于流,但是又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的(input和output)读写通常是单向的。通道可以非阻塞读取和写入通道,通道可以支持读取或写入缓冲区,也支持异步读写。
Selector选择器
Selector是一个java NIO组件,可以检测一个或多个NIO通道,并确定已经准备好进行读取或者写入。这样,一个单独的线程就可以管理多个Channel,从而管理多个网络连接,提高效率。
在这里插入图片描述

  • 每个channel都会对应一个Buffer
  • 一个线程对应Selector,一个Selector对应多个Channel
  • 程序切换到那个channel是由事件决定
  • Selector会根据不同的事件,在各个通道上切换
  • Buffer就是一个内存块,底层就是一个数组,数据的读取和写入都是通过Buffer来实现的

五、NIO三板斧

在这里插入图片描述

六、NIO实现案例

客户端

public class NioClient {public static void main(String[] args) throws IOException {SocketChannel socketChannel=SocketChannel.open();socketChannel.configureBlocking(false);InetSocketAddress address = new InetSocketAddress("127.0.0.1", 9000);if (!socketChannel.connect(address)) {while (!socketChannel.finishConnect()){System.out.println("连接中,客户端可以进行其他工作");}String str="hello world!";ByteBuffer wrap = ByteBuffer.wrap(str.getBytes());socketChannel.write(wrap);//避免客户端中断System.in.read();}}
}

服务器端

public class NioServer {public static void main(String[] args) throws IOException {// 获取一个ServerSocket通道ServerSocketChannel serverChannel = ServerSocketChannel.open();// serverChannel通道一直监听9000端口serverChannel.socket().bind(new InetSocketAddress(9000));// 设置serverChannel为非阻塞serverChannel.configureBlocking(false);//创建Selector选择器用来监听通道Selector selector = Selector.open();// 把ServerSocketChannel注册到selector中,并且selector对客户端的连接操作感兴趣SelectionKey selectionKey = serverChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("服务启动成功!");while(true){/** 如果事件没有到达 selector.select() 会一直阻塞等待*/selector.select();Set<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectionKeys.iterator();while (iterator.hasNext()){SelectionKey key = iterator.next();if (key.isAcceptable()) // 如果是OP_ACCEPT事件,则进行连接获取和事件注册{ServerSocketChannel server = (ServerSocketChannel) key.channel(); //连接获取SocketChannel socketChannel = server.accept(); // 连接获取socketChannel.configureBlocking(false); // 设置为非阻塞SelectionKey selKey = socketChannel.register(selector, SelectionKey.OP_READ); //这里只注册了读事件,如果需要给客户端写数据,则需要注册写事件System.out.println("客户端连接成功!");}else if(key.isReadable()) //如果是OP_READ事件,则进行读取和打印{SocketChannel socketChannel = (SocketChannel) key.channel();ByteBuffer byteBuffer = ByteBuffer.allocate(128);int len = socketChannel.read(byteBuffer);if (len > 0) //如果有数据,则打印数据{System.out.println("接受到客户端数据"+new String(byteBuffer.array()));}else if(len==-1) //如果客户端断开连接,关闭socket{System.out.println("客户端断开连接!");socketChannel.close();}}// 从事件集合中删除本次处理的key,防止下次select重复处理iterator.remove();}}}
}

这篇关于第六课:NIO简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767424

相关文章

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个,在线3D定制引擎Myway 3D。 用于在线商品定制,比如个性化服装的定制、日常用品(如杯子)、家装(被套)等物品的在线定制。 特性列表: 可更换衣服款式,按需定制更换模型可实时更改材质颜色可实时添加文本,并可实时修改大小、颜色和角度,支持自定义字体可实时添加艺术图标,并可实时修改大小、颜色和角度,支持翻转、各种对齐可更改衣服图案,按需求定制

BD错误集锦5——java.nio.file.FileSystemException 客户端没有所需的特权

问题:在运行storm本地模式程序时,java.nio.file.FileSystemException  客户端没有所需的特权   解决方式:以管理员身份运行IDEA即可。

shader language学习(1)——shader language简介背景

shader language,称为着色语言,shade在英语是阴影、颜色深浅的意思。shader language基于物体本身属性和光照条件,计算美格橡塑的颜色值。 实际上这种解释具有明显的时代局限性,在GPU编程发展的早期,shader language的提出目标是加强对图形处理算法的控制,所以对该语言的定义也针对于此。但随着技术的进步,目前的shader language早已经用于通用计算

算法13—Bit Map算法简介

1. Bit Map算法简介          来自于《编程珠玑》。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 2、 Bit Map的基本思想         我们先来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专

Java NIO 创建/复制缓冲区

创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1、调用allocate方法 2、调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义; allocate方法创建缓冲区 调用allocate方法实际上会返回new HeapCharBuffer(capacity, capacity)对象; 缓存空间存储在CharBuffer类的成员属性char[] h

Zustand 状态管理库简介

1. Zustand 简介 Zustand(德语中意为“状态”)是一个使用简单 API 的 React 状态管理库。它的核心思想是以状态切片(slices)的方式组织应用状态,从而实现高效的状态管理。Zustand 提供了比 Redux 更加简洁和直接的用法,同时支持异步操作和中间件。 在React开发中,状态管理是一个非常重要的概念。虽然 React 提供了 useState 和 useRe

SpringCloud Config简介

简介 Spring Cloud Config为分布式系统的外部配置提供服务端(server)和客户端(client)的支持。Config服务端提供了一个集中的地方来管理所有环境下各个应用的配置,Config客户端即普通的Spring应用,但不局限于Spring应用,理论上任意应用都可以作为Config的客户端。Config服务端和客户端的概念都源自于Spring的Environment和Prop

常用加密算法之 RSA 简介及应用

引言 相关博文: Spring Boot 开发 – 常用加密算法简介(一)常用加密算法之 SM4 简介及应用 一、RSA算法简介 RSA (Rivest-Shamir-Adleman) 算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年发明。它基于大数质因数分解的困难性,提供了一种安全的数据加密和解密方法。 1. 密钥生成

腾讯Hardcoder-Android通讯框架简介

APP 的功能和业务特性不依赖于该框架。 总而言之,由于Hardcoder是腾讯主导的,所以我们不用太担心兼容性问题,腾讯会和手机厂商进行洽谈并提供解决方案,并且目前已经支持Hardcoder框架的手机厂商有OPPO、vivo、华为、小米、三星、魅族等。 Hardcoder 性能优化技术方案 Hardcoder 优化基础 Hardcoder 在Android系统侧主要优化的方法有提高 CP