【网络编程(二)】NIO快速入门
NIO
Java NIO 三大核心组件
- Buffer(缓冲区):每个客户端连接都会对应一个Buffer,读写数据通过缓冲区读写。
- Channel(通道):每个channel用于连接Buffer和Selector,通道可以进行双向读写。
- Selector(选择器):一个选择器对应多个通道,用于监听多个通道的事件。Selector可以监听所有的channel是否有数据要读取,当某个channel有数据时,就去处理,所有channel都没有数据时,线程可以去执行其他任务。

使用 NIO 模型操作 Socket 步骤:
- 创建 ServerSocketChannel 服务器;
- 创建多路复用器 Selector(每个操作系统创建出来的是不一样的 ,Windows创建的是 WindowsSelectorImpl)
- ServerSocketChannel 将建立连接事件注册到 Selector中(register 方法往 EPollArrayWrapper 中添加元素)
- 处理事件
- 如果是建立连接事件,则把客户端的读写请求也注册到Selector中;
- 如果是读写事件则按业务处理。
案例代码:
public class NioServer {public static void main(String[] args) throws IOException {// 创建服务器ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8888));serverSocketChannel.configureBlocking(false); // 配置成非阻塞式的channel// 创建一个IO多路复用选择器Selector selector = Selector.open();// 注册serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {// 阻塞的方法,返回值代表发生事件的通道的个数// 返回值 0 超时// -1 错误// select方法可以传递超时时间,如果不传的话是timeout最后会为-1表示不会超时selector.select();// 如果不设的话客户端不操作会一直阻塞在这// 只要走到这里,必然说明,发送了事情,有可读可写可连接的channelSet<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectionKeys.iterator();while (iterator.hasNext()) {SelectionKey selectionKey = iterator.next();// 这个事件处理完就删除if (selectionKey.isAcceptable()) {// 有客户端来连接了// 三次握手建立连接SocketChannel socketChannel = serverSocketChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024));System.out.println("某某客户端连接来啦");}if (selectionKey.isReadable()) {SocketChannel socketChannel = (SocketChannel) selectionKey.channel();ByteBuffer buffer = (ByteBuffer) selectionKey.attachment();buffer.clear();int read = socketChannel.read(buffer);if (read == -1) { // 如果是可读事件,然后又没有数据,说明是客户端与服务器端的连接断开了,// 这个时候我们关闭通道,不然选择器会一直监听通道,导致不必要的业务执行socketChannel.close();} else {System.out.println(new String(buffer.array(), 0, buffer.position()));System.out.println("有信息需要读取");}}iterator.remove();}}}
}
doSelect 方法是由 WindowsSelectorImpl 类去实现的,这是select方法最后执行的方法,因为加了互斥锁,也是为什么说这里同步阻塞的原因。

俩问题:
-
当 Selector.select() 方法返回后,它会返回一组 SelectionKey 对象,这些对象代表了已经就绪的 I/O 通道,即对应的文件描述符上有事件发生。这些 SelectionKey 对象Key用来处理对应的事件。但是,如果不将已经处理过的 SelectionKey 对象从 Selector 中删除,下次调用 Selector.select() 方法时,这些已经处理过的 SelectionKey 对象扔然会被返回,导致多余的事件处理,影响性能问题。
-
删除的话,我们可以通过
SelectionKey.cancel()方法来实现,并且使得对应的通道(即文件描述符)不再被Selector监视。(这是有问题的,这样的话以后这个 SelectionKey 就不会再被监听了)可以在迭代器使用的时候对其进行删除。
Netty 封装好后就帮我们解决了这种问题,不会出现事件处理完后续还会一直处理的现象。
相关文章:
【网络编程(二)】NIO快速入门
NIO Java NIO 三大核心组件 Buffer(缓冲区):每个客户端连接都会对应一个Buffer,读写数据通过缓冲区读写。Channel(通道):每个channel用于连接Buffer和Selector,通道可以进行双向读…...
【Vue-Router】嵌套路由
footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…...
MySQL索引总结
MySQL索引总结 1.索引的概念、作用与使用场景 本质上就是减少读写磁盘的次数。 索引是一种特殊的文件,包含这对数据表中所有记录的引用指针,可以对表中的一列或多列创建索引,并指定索引的类型,每种类型都有对应数据结构实现。 …...
谷粒商城第十二天-基本属性销售属性管理功能的实现
目录 一、总述 二、前端部分 三、后端部分 四、总结 一、总述 前端的话,依旧是直接使用老师给的。 前端的话还是那些增删改查,业务复杂一点的话,无非就是设计到多个字段多个表的操作,当然这是后端的事了,前端这里…...
利用安全区域的概念解决移动端兼容不同手机刘海的问题
移动端 安全区 在做移动端的项目时,由于不同的手机设备设置的不同,有些手机在上方有刘海的设计,我们需要做适配,即把想要展示的内容放在安全区域内展示。 1.自定义导航栏 在pages.json中修改如下配置 {"path":"…...
数据结构---图
这里写目录标题 图的基本概念和术语基本概念和术语1基本概念和术语2 图的类型定义抽象数据类型定义二级目录二级目录 一级目录二级目录二级目录二级目录二级目录二级目录二级目录 图的基本概念和术语 基本概念和术语1 V代表顶点的有穷非空集合 E代表边的有穷集合 n为顶点 有向…...
励志长篇小说《周兴和》书连载之十八 内外交困搞发明
内外交困搞发明 路灯发出昏黄而惺忪的光影。 周兴和疲惫地从车间出来,拖着沉重的腿爬上几级石阶,准备回到家里去。可走到家门口,他想了想,又折了回去,在车间的一条长条椅子上,他用一块试验用的废料当枕头&…...
web基础入门和php语言基础入门 二
web基础入门和php语言基础入门 二 MySQL入门-续MySQL之数据查询操作MySQL其他知识点 php语言基础入门认识PHPPHP的工作流程安装PHP环境认识一个PHP程序PHP基础知识点进入正题 PHP与WEB交互PHP与MySQL交互总结 MySQL入门-续 MySQL之数据查询操作 WHERE 子句,条件限…...
typeScript 之 Array
工具: PlayGround 源码:GitHub TypeScript 数组简介 在TypeScript中, 使用[]表示数组, 它的结构:let valus: 类型名[] 数据; // 数字 let numList: number[] [1, 2, 3]; // 字符串 let strList: string[] ["hello"…...
【题解】二叉树的前中后遍历
文章目录 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历 二叉树的前序遍历 题目链接:二叉树的前序遍历 解题思路1:递归 代码如下: void preorder(vector<int>& res, TreeNode* root){if(root nullptr) return;//遇到空节点…...
文件操作/IO
文件 文件是一种在硬盘上存储数据的方式,操作系统帮我们把硬盘的一些细节都封装起来了,程序员只需要了解文件相关的接口即可,相当于操作文件就是间接的操作硬盘了 硬盘用来存储数据,和内存相比硬盘的存储空间更大,访问…...
基于Java+SpringBoot+vue前后端分离共享汽车管理系统设计实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
Mac RN环境搭建
RN ios android原生环境搭建有时候是真恶心,电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限,执行失败。因为Mac…...
log4j教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;…...
DP——背包问题
DP——背包问题 01背包问题分数背包问题多重背包问题完全背包问题 当我们谈论背包问题时,可以想象成一个小朋友要去旅行,但是他只能带一个容量有限的背包。他有一些物品可以选择放入背包,每个物品都有自己的重量和价值。小朋友的目标是在不超…...
【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法
文章目录 函数参数详解一、缺省参数二、不定长参数三、缺省参数在*args后面可变、不可变类型总结 进阶案例 函数参数详解 一、缺省参数 调用函数时,缺省参数的值如果没有传入,则取默认值。 下例会打印默认的age,如果age没有被传入…...
10个经典战略分析模型,助力洞察市场明确优势
在企业的经营管理过程中,要时刻清晰内外部环境和自身的优劣势,做好企业略规划,进行企业内外部资源的分析,对经营环境,企业核心竞争力有足够的判断,才能明确企业的发展方向。本文为大家分享10个常用的战略分…...
C++(Qt)软件调试---将调试工具安装到AeDebug(11)
C(Qt)软件调试—将调试工具安装到AeDebug(11) 文章目录 C(Qt)软件调试---将调试工具安装到AeDebug(11)1、前言1.1 使用的调试工具 2、调试器安装1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩内容👉个…...
浅谈限流式保护器在住宅电气防火的应用
安科瑞 华楠 【摘要】随着人民生活水平的提高,家用大功率电器普遍被使用,导致用电量剧增,电气火灾频发。文章分析了电气火灾发生的原因,并时电气火灾的防范措施进行了探讨。 【关键词】电气火灾;原因;防范…...
ChatGPT助力ModStartBlog,博客写作更智能
ModStartBlog v7.1.0,ChatGPT 支持、界面全新优化 在数字化时代,博客已经成为人们分享知识、表达观点和建立个人品牌的重要工具。ModStartBlog是一款流行的博客平台,其最新的版本v7.1.0不仅增加了ChatGPT支持,还对界面进行了全新…...
腾讯 Ardot 深度评测:一句话画 App,一键转代码,Figma 终于有了一个能打的对手?
2026 年 5 月 18 日,腾讯自研 AI 设计智能体平台 Ardot 正式公测。它不是又一个"AI 画图工具",而是一个真正打通产品、设计、研发三端的协作利器——从一句话生成可编辑设计稿,到一键交付生产级代码,全在一个工具里闭环…...
AWVS深度调优指南:从安装卡死到WAF绕过实战
1. 这不是“点几下就完事”的玩具,而是渗透测试中真正扛压的扫描引擎很多人第一次听说AWVS(Acunetix Web Vulnerability Scanner),是在某篇标题写着“三分钟上手”“一键扫出100个漏洞”的公众号推文里。结果装完发现:…...
解锁音乐自由:3分钟掌握QQ音乐加密音频无损解密技巧 [特殊字符]
解锁音乐自由:3分钟掌握QQ音乐加密音频无损解密技巧 🎵 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾为QQ音乐下载的歌曲只能在特定播放器…...
终极STL到STEP转换指南:从3D扫描到CAD设计的完整解决方案
终极STL到STEP转换指南:从3D扫描到CAD设计的完整解决方案 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 前言:跨越3D格式鸿沟的桥梁 在现代制造业和工程设计领域&…...
如何用Flut Renamer高效管理文件:跨平台批量重命名完整指南
如何用Flut Renamer高效管理文件:跨平台批量重命名完整指南 【免费下载链接】renamer Flut Renamer - A bulk file renamer written in flutter (dart). Available on Linux, Windows, Android, iOS and macOS. 项目地址: https://gitcode.com/gh_mirrors/ren/ren…...
RDP Wrapper:免费解锁Windows家庭版多用户远程桌面功能
RDP Wrapper:免费解锁Windows家庭版多用户远程桌面功能 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap RDP Wrapper Library是一个创新的开源项目,专为Windows家庭版和基础版用户提供完整的…...
如何快速上手Poppins字体:9种字重+天城文支持的多语言解决方案终极指南
如何快速上手Poppins字体:9种字重天城文支持的多语言解决方案终极指南 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 还在为多语言项目寻找合适的字体而烦恼吗&…...
TrafficMonitor插件终极指南:5分钟打造你的个性化Windows桌面监控中心
TrafficMonitor插件终极指南:5分钟打造你的个性化Windows桌面监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 你是否厌倦了在多个应用程序之间频繁切换来查看…...
小样本下分位数估计与置信区间构建实战指南
1. 项目概述:为什么小样本下的分位数估计如此重要?在机器学习项目的日常工作中,我们常常会面临一个尴尬的局面:模型训练好了,也跑出了几轮评估结果,比如准确率是92%,93%,91%…...
PvZ Toolkit完整指南:植物大战僵尸终极修改器使用教程 [特殊字符]
PvZ Toolkit完整指南:植物大战僵尸终极修改器使用教程 🎮 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 植物大战僵尸(Plants vs. Zombies)作为一款…...
