Java NIO框架Netty教程(六)-Java NIO Selector模式

Netty与NIO BIO,NIO,Netty简介,BIO,AIO,NIO的区别,NIO的Buffer缓冲区,通道,以及处理java.nio.BufferOverflowException异常!欢迎指出错误! 阅读详情

全文详见个人独立博客:Java NIO框架Netty教程(六)-Java NIO Selector模式

Java NIO框架Netty教程(六)-Java NIO Selector模式看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实现也是基于Java的Selector的,是对Selector的封装。所以,我个人认为理解好Selector对于使用和理解Netty都是很多有帮助的。当然,如果您确实不关心这些,只想会用Netty就可以了。那么下文,您可以略过:) 我对于Selector也是新上手学习的。之前很多新人跟我交流,都会提到一个新框架或者一个新开源工具的使用和上手的问题。他们会觉得上手困难,耗费事件。不过笔者,从来没有此种感觉。这里正好,借用Selector的学习过程,跟大家交流一下,我上手的过程。 想要使用一个工具,自然是先了解其定位,解决问题的原理或者工作流程。所以,笔者先从网上了解了一下Selector大概的工作流程。 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。 上面那段文字是我摘录的一小段总结,就这一小段基本已经可以说明问题了。接下来,我们要考虑的就是,要实现这个过程,我们需要做什么?顺着描述,我们可以想象,需要选择器,需要消息传送的通道,需要注册一个事件,用于识别。通道自然需要绑定到一个地址。有了这样大概的想法,我们就可以去API里找相关的接口。 Selector服务端样例代码: /** * Java NIO Select模式服务端样例代码 * * @author lihzh * @alia OneCoder * @Blog http://www.coderli.com * @date 2012-7-16 下午9:22:53 */ public class NioSelectorServer { /** * @author lihzh * @throws IOException * @alia OneCoder * @date 2012-7-16 下午9:22:53 */ public static void main(String[] args) throws IOException { // 创建一个selector选择器 Selector selector = Selector.open(); // 打开一个通道 ServerSocketChannel socketChannel = ServerSocketChannel.open(); // 绑定到9000端口 socketChannel.socket().bind(new InetSocketAddress(8000)); // 使设定non-blocking的方式。 socketChannel.configureBlocking(false); // 向Selector注册Channel及我们有兴趣的事件 socketChannel.register(selector, SelectionKey.OP_ACCEPT); for (;;) { // 选择事件 selector.select(); // 当有客户端准备连接到服务端时,便会出发请求 for (Iterator<SelectionKey> keyIter = selector.selectedKeys() .iterator(); keyIter.hasNext();) { SelectionKey key = keyIter.next(); keyIter.remove(); System.out.println(key.readyOps()); if (key.isAcceptable()) { System.out.println("Accept"); // 接受连接到此Channel的连接 socketChannel.accept(); } } } } } Selector客户端样例代码: /** * Java NIO Selector模式,客户端代码 * * @author lihzh * @alia OneCoder * @blog http://www.coderli.com */ public class NioSelectorClient { /** * @author lihzh * @throws IOException * @alia OneCoder */ public static void main(String[] args) throws IOException { SocketChannel channel = SocketChannel.open(); channel.configureBlocking(false); channel.connect(new InetSocketAddress("127.0.0.1", 8000)); } } 代码很简单,服务端接受到客户端的连接请求后,会打印出”Accept“信息。 简单概括就是,整一个通道,通道加个选择过滤器,看来的事件是不是我想要的,不想要的干脆不管,想要的,我就存起来,留着慢慢处理。 现在感觉是不是Netty确实跟这个机制比较像,如果让你去实现Netty现有的功能,也有思路可想了吧。icon-default.png?t=N7T8https://www.coderli.com/netty-nio-selector/交流探讨,加入群聊【Java学习交流(982860385)】

看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实现也是基于Java的Selector的,是对Selector的封装。所以,我个人认为理解好Selector对于使用和理解Netty都是很多有帮助的。当然,如果您确实不关心这些,只想会用Netty就可以了。那么下文,您可以略过:)

我对于Selector也是新上手学习的。之前很多新人跟我交流,都会提到一个新框架或者一个新开源工具的使用和上手的问题。他们会觉得上手困难,耗费事件。不过笔者,从来没有此种感觉。这里正好,借用Selector的学习过程,跟大家交流一下,我上手的过程。

想要使用一个工具,自然是先了解其定位,解决问题的原理或者工作流程。所以,笔者先从网上了解了一下Selector大概的工作流程。

NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。

上面那段文字是我摘录的一小段总结,就这一小段基本已经可以说明问题了。接下来,我们要考虑的就是,要实现这个过程,我们需要做什么?顺着描述,我们可以想象,需要选择器,需要消息传送的通道,需要注册一个事件,用于识别。通道自然需要绑定到一个地址。有了这样大概的想法,我们就可以去API里找相关的接口。

Selector服务端样例代码:

全文详见个人独立博客:Java NIO框架Netty教程(六)-Java NIO Selector模式

交流探讨,加入群聊【Java学习交流(982860385)】

Socket,NIO,Netty介绍 1. Socket回顾与I/0模型 1.1 Socket网络编程回顾 1.1.1 Socket概述 Socket,套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。 Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。 它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。 1.1.2 阅读详情

相关推荐

【Java硬核知识:IO/NIO核心原理与性能压榨】Selector空轮询Bug:Netty是如何彻底解决的?

摘要:本文围绕 Java NIO 中 Selector 空轮询 Bug 展开,先回顾 NIO 基础与 Selector 工作原理,剖析空轮询触发条件,包括网络、系统、并发及 JDK 版本等因素。接着阐述 Netty 的 rebuildSelector 策略,通过检测空轮询后重建 Selector 解决问题,并分析其优缺点。同时介绍 select、poll 和 epoll 原理,说明 Java 中使用 epoll 的方法与优势。最后通过实操案例,展示基于 Netty 和 epoll 构建高性能网络服务器的过程

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1249

NIO使用Reactor模式遇到的问题

关于Reactor模式,不再多做介绍,推荐Doug Lea大神的教程:Java 可扩展的IO 本来在Reactor的构造方法中完成一系列操作是没有问题的: public class Reactor implements Runnable { private final Selector selector; public Reactor() ...

weixin_33991418的博客 237

Python-uiautomator2保姆级安装指南:从环境配置到设备连接全流程

本文提供Python-uiautomator2的保姆级安装指南,涵盖从环境配置到设备连接的全流程。详细介绍了Python 3.6+、ADB工具等核心组件的准备,以及uiautomator2的安装和设备端服务初始化步骤,帮助开发者快速搭建Android自动化测试环境,避免常见问题。

nnn11的博客 939

学习Netty(七)------Selector 和事件模型

在 Netty 中,Selector 是实现多路复用的关键组件之一。它提供了一种高效的 I/O 处理方式,允许一个单独的线程管理多个通道,实现并发的处理大量连接。本文将深入探讨 Netty 中 Selector 的设计原理和使用方法,并结合代码进行详细介绍。

qq_43279796的博客 1791

QT使用高精度定时器

精度相对第二种方法高许多。

ljjjjjjjjjjj的博客 4097

Android加密开发实战:Spongy Castle集成与国密算法应用指南

在移动应用开发中,数据加密是保障用户隐私和信息安全的基石。其原理基于密码学算法,通过对数据进行编码转换,确保即使数据被截获也无法被未授权方解读。这项技术的核心价值在于为敏感信息提供机密性、完整性和身份验证,广泛应用于用户登录、本地存储、网络通信等场景。对于Android开发者而言,系统自带的加密功能有时无法满足需求,特别是涉及国密算法或更丰富算法套件时。本文聚焦于Spongy Castle这一专为Android定制的加密库,它有效解决了与系统内置Bouncy Castle的兼容性问题,并提供了对SM4等国密

weixin_27722377的博客 309

netty入门(五)Selector介绍和原理

Selector能够检测多个注册的通道上是否有事件发生(注意:多个Channel以事件的方式可以注册到同一个Selector),如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管理多个通道,也就是管理多个连接和请求

zhufei463738313的博客 1229

汽车OTA 测试用例

汽车OTA 测试用例

天赐好车的博客 974

Netty框架之Selector使用详解

谈到Selector的具体使用,那么就要结合BIO,NIO的知识讲解,Selector使用在非阻塞模式NIO场景下,学习NIO之前先要了解BIO原理,下面我们一步步讲解 一.BIO(Blocking-IO)-阻塞IO模式 先来看一下BIO下服务端的代码 public static void main(String[] args) throws Exception { //创建服务端通道 ServerSocketChannel ssc = ServerSocketChannel

TheWayForDream 1777

HyperLynx(十五)多板仿真

在对话框的“Design file#1”下拉列表中选择“B00,Mainboard”,在其下方的“Reference designators”列表中选择元器件“J1”,然后在“Designfile#2”下拉列表中选择“BO1、RAM1”,在其下方的“Refer ence designators”列表中选择元器件“J1”,单击“Insert”按钮,为这两个元器件建立互连映射。在“Assign Models”对话框中,选择“B00 Motherboard”,将“U16.B12”设置为输出。

小幽余生不加糖 5060

基于AUTOSAR的汽车电子项目--电动助力转向系统

基于AUTOSAR的汽车电子项目开发通常涵盖广泛的领域,例如动力系统控制、车身电子、信息娱乐系统、高级驾驶辅助系统(ADAS)等。以下是一个简化的示例项目,展示了如何在AUTOSAR环境下开发一个电动助力转向系统(Electric Power Steering, EPS)的控制软件

MHD0815的博客 2131

Java NIO框架Netty教程(六) Java NIO Selector模式

上一篇:Java NIO框架Netty教程(五) 消息收发次数不匹配的问题    http://www.it165.net/pro/html/201207/3219.html 看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实现也是基于Java的Selector的

jackwu_2015的博客 2420

基于Simulink的光储系统黑启动能力仿真

本文基于Simulink平台构建了光储系统黑启动仿真模型,详细阐述了储能VF控制、光伏孤岛MPPT和同步并网等核心控制策略。通过分阶段协调控制(储能启动→关键负载→光伏接入→非关键负载→同步并网),实现了60秒内恢复供电、母线电压波动<5%的性能指标。仿真结果表明,协调控制策略相比无序启动可显著提升系统稳定性,避免电压崩溃和负载跳闸。文章还提供了完整的建模步骤、核心代码及进阶优化方向,为微电网应急供电设计提供了实用参考。该模型适用于光伏储能系统的黑启动能力验证和优化研究。

amy_mhd的博客 106

nio框架netty在项目中的应用

背景: 省分短信发送每天都差不多要1000W条上下,遇到特殊节假日和政府通告时量会更大!boss系统中存放的是短信发送内容,而真正完成发送短信指令动作是的华为方做的短厅,这么大的通信量选择了netty来完成数据传输并自定义了一套基于netty的SGIP协议进行通信; 省分boss系统—>短信营业厅(); 基本知识 2.1 TCP/IP网络协议 网上很多有关这个协议的解释,自行googl

不断出发,永无抵达! 1万+

PrimeTime low power-多电压设计流程(1)

PrimeTime支持使用IEEE 1801统一电源格式(UPF)标准来指定设计的多电压特性。PrimeTime能够在多电压供电和使用set_voltage命令在特定电源网上设置电压值的情况下,正确分析设计的时序。要了解如何使用多电压设计流程,请参考以下内容:- 多电压分析需求- 指定电源连接性- UPF命令- GoldenUPF流程- 多重电源电压分析。

QRBQ 528

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Netty框架基本介绍

NIO 1.概述:NIO全称java non-blocking IO ,是指JDK1.4开始,java提供了一系列改进的输入/输出的新特性,被统称为NIO(即New IO )。新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对java.io包中的许多类进行了改写,新增了满足NIO的功能。NIO和BIO有着相同的目的和作用,但是他们的实现方式完全不同,BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多。另外,NIO是非阻塞式的,这一点跟BIO也很

zhijingzhi的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

以 Java NIO 的角度理解 Netty

由于 Netty 的抽象程度较高,因此理解起来可能会更加复杂和具有挑战性,所以本文将通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码更加清晰地理解Netty。

二蛋的博客 2186

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Netty 针对 Java NIO Selector 优化:SelectedSelectionKeySet

Netty的SelectedSelectionKeySet通过数组替代JDK的HashSet优化NIO性能:1) 使用数组存储SelectionKey,将add操作降为O(1);2) 通过reset()批量清空数组,替代原生remove()操作;3) 利用反射替换Selector内部实现,避免哈希计算和GC压力。这一优化将事件处理性能提升到极致。

lifallen的博客 1082

Java NIO、Reactor、Netty

文章目录1.NIO概述2.Channel3.Buffer4.Selector5.内存映射文件 1.NIO概述   NIO包括:Channel、Buffer、Selector   NIO是面向缓冲区的,传统IO是面向流的;传统IO基于字节流、字符流进行操作。NIO基于Channel和Buffer进行操作,数据总是从Channel读到Buffer,从Buffer写到Channel。传统IO是阻塞的,N...

ZXW601498616的博客 1105

Netty之NIO

空转”指的是:Selector 频繁触发写事件,但你没有实际业务要处理(即没有数据需要写),这会造成CPU 空耗,浪费资源。本质上就是:写事件一直在通知你,但你啥也不用干,程序在“白忙活”。

qq_45101876的博客 1869

Netty学习专栏(一):Java NIO编程与核心组件详解

本文探讨了在分布式系统和微服务架构中,高性能网络通信的重要性,并介绍了Netty作为Java领域最成熟的高性能网络框架的应用。文章强调,理解Java NIO(New I/O)的核心概念是掌握Netty的基础,因为Netty的线程模型和零拷贝等高级特性都建立在NIO模型之上。文章详细对比了BIO(Blocking I/O)和NIO(Non-blocking I/O)的核心差异,包括阻塞方式、编程模型、数据处理方式和代码结构。

qq_43947876的博客 1501

Java NIO框架Netty教程(七)-再谈收发信息次数问题

​ 在《Java NIO框架Netty教程(五)- 消息收发次数不匹配的问题》里我们试图分析一个消息收发次数不匹配的问题。当时笔者还是心存疑惑的。所以决定先学习一下Java NIO的Selector机制。 经过简单的了解,笔者大胆的猜测和”武断”一下该问题的原因。

CoderCoding的博客 1148

Java NIO框架Netty教程(十二)-并发访问测试(中)

​ 写在前面:对Netty并发问题的测试和解决完全超出了我的预期,想说的东西越来越多。所以才出现这个中篇,也就是说,一定会有下篇。至于问题点的发现,OneCoder也在努力验证中。

CoderCoding的博客 746

netty系列之:NIO和netty详解

文章目录简介NIO常用用法NIO和EventLoopGroupNioEventLoopGroupSelectorProviderSelectStrategyFactoryRejectedExecutionHandlerEventLoopTaskQueueFactoryNioEventLoop总结 简介 netty为什么快呢?这是因为netty底层使用了JAVA的NIO技术,并在其基础上进行了性能的优化,虽然netty不是单纯的JAVA nio,但是netty的底层还是基于的是nio技术。 nio是JDK1.

程序那些事 6433
上一篇: Java NIO框架Netty教程(五)- 消息收发次数不匹配的问题
下一篇: Java NIO框架Netty教程(七)-再谈收发信息次数问题
CoderCodingNo
博客等级 码龄4年 2041粉丝 635原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值