当前位置: 首页 > news >正文

1.浅析NIO 多路复用器selector

一:IO基本介绍

Java共支持3种网络编程IO模式:BIO,NIO,AIO

0.Java对BIO、NIO、AIO的支持:

Java BIO同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
Java NIO同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2)异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS(操作系统)先完成了再通知服务器应用去启动线程进行处理。
在这里插入图片描述

BIO三个重要部分:
Buffer 缓冲区
Channel 通道
Selector 多路复用器

1.BIO、NIO、AIO适用场景分析:

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于**连接数目多且连接比较长(重操作)**的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

二:业务代码浅析

在这里插入图片描述

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;public class NioSelector {public static void main(String[] args) throws IOException, InterruptedException {// 创建NIO ServerSocketChannelServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(8000));// 设置ServerSocketChannel为非阻塞serverSocketChannel.configureBlocking(false);// 打开Selector处理Channel,多路复用器开启,获取SelectorSelector selector = Selector.open();//把ServerSocketChannel注册到selector上,selector对客户端accept连接操作感兴趣SelectionKey register = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("ServerSocket服务启动成功!!!");while (true) {// 阻塞,等待需要处理的事件selector.select();// 获取selector中注册的全部事件的 SelectionKey 实例Set<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectionKeys.iterator();// 遍历SelectionKey对事件进行处理while (iterator.hasNext()) {SelectionKey key = iterator.next();// 如果是OP_ACCEPT事件,则进行连接获取,后读事件注册if (key.isAcceptable()) {//通过SelectionKey 反向找对应的 ServerSocketChannel ServerSocketChannel server = (ServerSocketChannel) key.channel();//获取到连接事件后,建立客户端连接SocketChannel socketChannel = server.accept();socketChannel.configureBlocking(false);// 注册了读事件,如果需要给客户端发送数据可以注册写事件socketChannel.register(selector, SelectionKey.OP_READ);System.out.println("客户端连接成功,且建立了read事件");} else if (key.isReadable()) {  // 如果是OP_READ事件,则进行读取和打印//扫描到已经注册的channel的read事件,获取对应的SocketChannel SocketChannel socketChannel = (SocketChannel) key.channel();//读取channel中的数据bufferByteBuffer byteBuffer = ByteBuffer.allocate(128);int len = socketChannel.read(byteBuffer);// 如果有数据,把数据打印出来if (len > 0) {System.out.println("接收到消息:" + new String(byteBuffer.array()));} else if (len == -1) { // 如果客户端断开连接,关闭SocketSystem.out.println("客户端断开连接~~~");socketChannel.close();}}//从事件集合里删除本次处理的key,防止下次select重复处理iterator.remove();}}}
}

启动本机main函数,windows环境下cmd,后
telnet localhost 8000 建立连接。

核心方法:

Selector.open()  //创建多路复用器 实质是epoll实例的创建和获取
socketChannel.register(selector, SelectionKey.OP_READ)  //将channel注册到selector多路复用器上
selector.select()  //阻塞等待需要处理的事件发生

epoll的几个方法:

epoll_create 创建epoll实例
epoll_ctl:注册到epoll的响应事件
epoll_wait:阻塞,等待事件的发生(连接、读取等事件)

Selector会不断轮询注册在其上的Channel,如果某个Channel上发生了连接/读写事件,channel就属于就绪状态,会被Selector轮询出来,然后通过SelectionKey 获取就绪的Channel集合,进行后续的IO操作。

Selector内部有2个集合:
channel 注册的连接集合 和 注册的事件集合

/*** @return  This selector's key set**/
public abstract Set<SelectionKey> keys();/***获取selector中注册的全部事件的 SelectionKey 实例* Returns this selector's selected-key set.*/
public abstract Set<SelectionKey> selectedKeys();

相关文章:

1.浅析NIO 多路复用器selector

一&#xff1a;IO基本介绍 Java共支持3种网络编程IO模式&#xff1a;BIO&#xff0c;NIO&#xff0c;AIO 0.Java对BIO、NIO、AIO的支持&#xff1a; Java BIO &#xff1a; 同步并阻塞&#xff0c;服务器实现模式为一个连接一个线程&#xff0c;即客户端有连接请求时服务器端…...

Day920.结构化日志业务审计日志 -SpringBoot与K8s云原生微服务实践

结构化日志&业务审计日志 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于结构化日志&业务审计日志的内容。 1、什么是结构化日志 结构化日志&#xff08;Structured Logging&#xff09;是一种将日志信息组织为结构化数据的技术。 传统的日志通常是一些文…...

前端代码复用学习笔记:整洁架构与清晰架构

基础代码的复用往往比较简单&#xff0c;但是业务代码的复用通常是困难的&#xff0c;如果没有特殊的手段去治理项目会逐渐发展为难以维护的巨石应用&#xff0c;按照维基百科记载&#xff0c;代码的复用形式主要有三种&#xff0c;程序库&#xff0c;应用框架&#xff0c;设计…...

【python刷题】leecode官方提示“->“,“:“这些符号是什么意思?什么是Type Hints?

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…...

【华为OD机试真题2023 JAVA】最佳对手

华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 最佳对手 知识点排序DFS搜索回溯 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 游戏里面,队伍通过匹配实力相近的对手进行对战。 但是如果匹配的队伍实例相差太大,对于双方游戏体验都不会太好。 给定n个…...

css实现文字大小自适应

在页面编写中经常会碰到页面自适应的问题&#xff0c;也就是页面内部的元素会随着窗口的放大缩小而放大缩小&#xff0c;box可以通过calc 百分比的形式做到页面自适应&#xff0c;但是box内的字体却无法做到这点&#xff0c;往往box自适应大小了&#xff0c;内部的字体还是原来…...

【Redis】搭建哨兵集群

目录 集群结构 准备实例和配置 启动 测试 集群结构 这里我们搭建一个三节点形成的Sentinel集群&#xff0c;来监管之前的Redis主从集群。如图&#xff1a; 三个sentinel实例信息如下&#xff1a; 节点IPPORTs1192.168.150.10127001s2192.168.150.10127002s3192.168.150.…...

CTFHub | .htaccess

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…...

微机原理 || 8253 芯片 (详细讲解 + 经典例题)

一点点看&#xff01;一定可以看懂&#xff01;考试没有问题的&#xff01;加油&#x1f4aa; 前面知识写的详细&#xff0c;看不懂可以先看典例&#xff0c;回头来梳理就明白了【典例就是常考的题】 目录 Part 1: 芯片知识总结 &#xff08;一&#xff09;8253 芯片特点 …...

python Django高级操作-分页-定义CVS-发送邮件

分页 分页是指在web页面有大量数据需要显示&#xff0c;为了阅读方便在每个页页中只显示部分数据。优点: 1.方便阅读2.减少数据提取量&#xff0c;减轻服务器压力。Paginator对像 负责分页数据整体的管理对象的构造方法Paginator属性 Paginator方法 Paginator异常exception pag…...

React 用一个简单案例体验一遍 React-dom React-router React-redux 全家桶

一、准备工作 本文略长&#xff0c;建议耐心读完&#xff0c;每一节的内容与上一节的内容存在关联&#xff0c;最好跟着案例过一遍&#xff0c;加深记忆。 1.1 创建项目 第一步&#xff0c;执行下面的命令来创建一个 React 项目。 npx create-react-app react-example cd rea…...

9. C#面向对象基础

一、C# 类 在 C# 中&#xff0c;类是引用类型的。类由成员属性和成员方法构成。我们可以动态创建类的实例&#xff08;instance&#xff09;&#xff0c;这个实例也被称为对象&#xff08;object&#xff09;&#xff0c;我们可以通过类和对象来设计程序。 1、类的定义 类的定…...

【MIT 6.S081】Lab2: system calls

本Lab包括两个简单系统调用的实现&#xff0c;进一步熟悉系统调用接口。 笔者用时约1.5h 概述 根据文档说明&#xff0c;当我们添加一个系统调用时&#xff0c;比如第一个任务是添加一个trace&#xff0c;需要进行以下操作&#xff1a; 首先将系统调用的原型添加到user/user…...

设计模式之单例模式~

设计模式包含很多&#xff0c;但与面试相关的设计模式是单例模式&#xff0c;单例模式的写法有好几种&#xff0c;我们主要学习这三种—饿汉式单例&#xff0c;懒汉式单例、登记式单例,这篇文章我们主要学习饿汉式单例 单例模式&#xff1a; 满足要点&#xff1a; 私有构造 …...

top终端详解

1.top命令行使用 2.top每行意义 3.补充 1.top命令行使用 top命令是一个常用的Linux系统命令&#xff0c;用于实时查看系统的运行状态和进程信息。下面是top命令的几个常用参数的含义&#xff1a; -d seconds&#xff1a;设置top命令的更新间隔时间&#xff0c;单位是秒。默认是…...

解决一个偶现的503 bug,花了俺不少时间

概述 在3月2日晚上&#xff0c;大概8点左右&#xff0c;本想打道回府&#xff0c;回家休息&#xff0c;突然被人在bug群了一下&#xff0c;说是管理后台&#xff0c;访问不了&#xff0c;界面上出现了: 503 service temporarily unavailable我赶紧尝试访问了一下&#xff0c;确…...

什么是栈,如何实现?

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; “但有一枝堪比玉&#xff0c;何须九畹始征兰?” 前言&#xff1a; 栈是一种特殊的线性表&#xff0c;就像开盖的桶一样&#xff0c;从底部开始放数据&#xff0c;从顶部开始取数据&#xff0c;那么栈具体是…...

在我的MacBook上捣鼓ESP8266

周三是我们的篮球日&#xff0c;打篮球后总是会有些兴奋&#xff0c;然后就容易睡不着&#xff0c;额&#xff0c;睡不着就拿我的ESP8266开发板出来捣鼓一下。先下载编译工具链https://github.com/espressif/ESP8266_RTOS_SDK下载sdkgit clone https://github.com/espressif/ES…...

【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下多智能体深度强化学习算法 ippo&#xff0c;并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得&#xff1a;https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 1. 算法原理 多智能体的情形相比于单智…...

77.qt qml-QianWindow-V1版本界面讲解

上章介绍: 76.qt qml-QianWindow开源炫酷界面框架简介(支持白色暗黑渐变自定义控件均以适配) 界面如下所示: 代码结构如下所示:...

RHCE学习日记二

1、在 node1 主机上配置 chrony 时间服务器&#xff0c;将该主机作为时间服务器。 命令&#xff1a; vim /etc/chrony.conf 在文件位置添加命令&#xff1a; #Use public servers from the pool.ntp.org project. #Please consider joining the pool (https://www.pool.ntp.org…...

Dubbo原理简介

Dubbo缺省协议采用单一长连接和NIO异步通讯&#xff0c;适合于小数据量大并发的服务调用&#xff0c;以及服务消费者机器数远大于服务提供者机器数的情况。 作为RPC&#xff1a;支持各种传输协议&#xff0c;如dubbo,hession,json,fastjson&#xff0c;底层采用mina,netty长连接…...

JavaSE基础总结

JDK与JRE JDK&#xff0c;全称Java Development Kit&#xff0c;Java开发工具包 JRE&#xff0c;全称Java Runntime Environment&#xff0c;Java运行环境 JDK包含后者JRE。 JDK也可以说是Java SDK&#xff08;Software Development kit&#xff0c;软件开发工具包&#xff09;…...

5G(NR)信道带宽和发射带宽---频率资源

前言 查看此文之前建议先看看这篇 5G(NR)频率资源划分_nr运营商频段划分_达帮主的博客-CSDN博客NR频率有上面几个划分 &#xff0c;可以使用低于1GHz的频端&#xff0c;既可以使用高于30GHz高频端。使用频端高于30GHz那我们称之为高频或者毫米波。使用毫米波是5G网络区别于4G…...

基于Spring Boot的酒店管理系统

文章目录 项目介绍主要功能截图:登录首页房间类型酒店预约部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的酒店管理系统…...

Ae:混合模式

Ae 中内置了 Ps 的渲染引擎&#xff0c;同样可在多处应用混合模式 Blending Mode。与 Ps 相比&#xff0c;除了两组图层通道相关的特定模式&#xff0c;其它的混合模式几乎是一模一样。相关快捷键&#xff1a;下一图层混合模式&#xff1a;Shift 上一图层混合模式&#xff1a;…...

JS中的变量

系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录前言1、概念2、定义变量3、变量名的规则4、变量本质5、赋值6、常用操作前言 相对于青龙面板来说&#xff0c;变量就是你填入青龙的cookie&#xff0c;简称ck 在实际项目中&#xff0…...

Hadoop运行模块

二、Hadoop运行模式 1&#xff09;Hadoop官方网站&#xff1a;http://hadoop.apache.org 2&#xff09;Hadoop运行模式包括&#xff1a;本地模式、伪分布式模式以及完全分布式模式。 本地模式&#xff1a;单机运行&#xff0c;只是用来演示一下官方案例。生产环境不用。伪分…...

Web自动化——前端基础知识(二)

1. Web前端开发三要素 web前端开发三要素 什么是HTMl&#xff1f; Html是超文本标记语言&#xff0c;是用来描述网页的一种标记语言HTML是一种标签规则的形式将内容呈现在浏览器中可以以任意编辑器创建&#xff0c;其文件扩展名为.html或.htm保存即可 什么是CSS&#xff1f;…...

NAS系列 硬件组装

转自我的博客文章https://blognas.hwb0307.com/nas/3260&#xff0c;内容更新仅在个人博客可见。欢迎关注&#xff01; 前言 之前我在《NAS系列 硬件选择》里讲述了自己为了升级NAS如何选配硬件。本节我大概说一些我的新NAS硬件组装的注意事项。到目前为止&#xff0c;我只装过…...