首页 > 编程语言 >Java NIO框架Netty教程(六)-Java NIO Selector模式

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

时间:2024-07-26 10:54:11浏览次数:12  
标签:Netty Java NIO selector Selector 我们

全文详见个人独立博客: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)】

标签:Netty,Java,NIO,selector,Selector,我们
From: https://blog.csdn.net/CoderCoding/article/details/140705236

相关文章

  • (Javaweb)Vue
    目录一.Vue概述二Vue指令三.vue生命周期一.Vue概述1.model--数据模型:包含了很多的业务数据以及数据的处理方法2.view--视图层--数据的展示--DOM元素3.viewmodel--完成数据绑定的核心,实现model与viewmodel之间的数据连接其中,MVVM由三部分组成,model,view,viewmodelm......
  • (Javaweb)js
    目录一.js介绍二.引入方式三.js基础语法1.书写语法2.js变量3.数据类型运算符流程控制语句 四.js函数五.js对象六.js对象--Array数组七js对象--String字符串八.js对象--JSON九.js对象--BOM十.js对象--DOMDOM案例一.js介绍脚本语言:代码不需要进行编译,直......
  • JavaScript 基础
    JavaScript简介JavaScript是一种具有函数优先原则的轻量级、解释型、即时编译型的编程语言。函数优先原则:函数可以和其他任何变量一样对待,而且函数的优先级会被提升。.轻量级:语法和Java类似,语法简单易学。解释型:代码在运行时直接由解释器逐行解释和执行,而不需要事先将......
  • Java毕业设计-基于springboot开发的ONLY在线商城系统设计与开发-代码-毕业论文(附毕设
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、用户信息管理2、商品分类管理3、商品信息管理4、轮播图管理四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的ONLY在线商......
  • Java毕业设计-基于springboot开发的在线课程管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、管理员模块的实现1.1教师信息管理1.2学生信息管理1.3在线课程管理1.4班级分类管理2、教师模块的实现2.1在线课程信息2.2教学计划管理2.......
  • 终端输入mvn -v报错:JAVA_HOME not found in your environment.
    终端输入mvn-v报错:JAVA_HOMEnotfoundinyourenvironment.       原因在于jdk环境变量未配置好。环境变量设置有如下两种方法:1、右键我的电脑-->属性-->高级系统设置-->环境变量-->系统变量-->双击Path-->点击新建-->输入jdk本地路径(如:D:\Tools\jdk1.8.0_121\bin)-......
  • java题目之金额转换以及如何优化
    publicclassScannerDemo5{publicstaticvoidmain(String[]args){//键盘录入一个金额intmoney;while(true){System.out.println("请输入一个金额:");Scannersc=newScanner(System.in);mon......
  • java环境变量的配置
    1.path环境变量配置的作用程序的执行需要使用外部指令javac,但是javac指令仅仅能在JDK安装目录下的bin目录下时候,因此程序只能写入bin目录程序开发过程中,不能将源代码写入JDK的安装目录,因此需要将源程序保存到任意位置的指定目录(英文目录),所以需要使javac指令在任意目录下可以运......
  • JAVA编译和运行的CMD命令
    JAVA编译和运行的CMD命令编译JAVA程序编译Java程序是将源代码文件(.java)转换为字节码文件(.class)的过程。在CMD中,我们可以使用javac命令来进行编译。命令格式:javac[选项]文件名.java运行JAVA程序编译完成后,你可以使用java命令来运行生成的字节码文件。命令格式:java[选项]......
  • JavaWed过滤器和监听器(知识回顾+详解)
    过滤器 Filter   1.1概念       在浏览器和目标资源之间进行过滤的中间组件。       请求到达目标资源之前进行过滤。       响应到达浏览器之前进行过滤。   1.2定义过滤器的步骤      1.写一个java类,实现Filter接口   ......