首页 Java java教程 关于Nio具体工作过程示例代码

关于Nio具体工作过程示例代码

Jul 03, 2017 am 11:20 AM
工作 方式 经典

 1 public void selector() throws IOException { 2     
 ByteBuffer buffer = ByteBuffer.allocate(1024); 3     
 Selector selector = Selector.open(); 4     
 ServerSocketChannel ssc = ServerSocketChannel.open(); 5     
 ssc.configureBlocking(false);//设置为非阻塞模式 6     
 ssc.socket().bind(new InetSocketAddress(8080)); 7     
 ssc.register(selector, SelectionKey.OP_ACCEPT);//注册监听事件 8     
 while(true) { 9         Set selectorKeys = selector.selectorKeys();
 //取得所有key的集合10         Iterator it = selectorKeys.iterator();11         
 while(it.hasNext()) { //检查序列是否还有元素12             
 SelectionKey key = (SelectionKey) it.next();13             
 if((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {14                 
 ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();15                 
 SocketChannel sc = ssChannel.accept();//接受到服务端的请求16                 
 sc.configureBlocking(false);17                 
 sc.register(selector,SelectionKey.OP_ACCEPT);18                 
 it.remove();19             } 
 else if((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {20                 
 SocketChannel sc = (SocketChannel) key.channel;21                 
 while(true) {22                     buffer.clear();23                     
 int n = sc.read(buffer);//读取数据24                     
 if(n <= 0) {25                         
 break;26                     }                     
 buffer.flip();28                 }                
 it.remove();30             }    
 }
 }
 }
登录后复制

  上面这段代码是书上关于Nio具体工作过程的代码示例。其工作过程可以具体阐述如下:

其中有两个关键的类:Channel和Selector,它们是NIO中的核心概念。其中Channel可类比为交通工具,而且是具体的交通工具,例如:汽车,自行车。而Selector则可以类比为车辆调度系统,负责车辆运行状况的监视和具体调度工作。

serverSocketChannel类是针对面向流的侦听套接字的可选择通道,在服务端创建完此类实例后通过Socket()方法(获取与此通道关联的服务器套接字)返回一个ServerSocket类的实例,在利用此实例的void bind(SocketAddress endpoint)方法将 ServerSocket 绑定到特定地址(IP 地址和端口号)。就像出租车公司的每辆出租车都要在公司注册一样,我们也需要将ServerSocketChannel的实例通过register()方法将此通道注册到指定的选择器。

然后调用Selector的selectedKeys方法来检查已经注册在这个选择器上的所有通信信道是否有需要的事件发生,如果有某个事件发生,将会返回所有的SelectionKey,由于key.readyOps()获取此键的 ready 操作集合,所以个人认为key.readyOps()&SelectionKey.OP_ACCEPT意思是此键的 ready 操作集合为ACCEPT状态,即服务器处于监听状态,通过这个对象的Channel方法就可以取得这个通信信道对象,然后调用accept()方法返回一个套接字通道,默认为阻塞状态,也可以利用Channel方法取得的通信信道对象读取通信的数据,而这里读取的数据是Buffer,这个Buffer是我们可以控制的缓冲器。


以上是关于Nio具体工作过程示例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
Go 语言中的时间处理方式有哪些? Go 语言中的时间处理方式有哪些? Jun 10, 2023 pm 09:42 PM

Go语言作为一个现代化的编程语言,时间在开发中占有很重要的位置。Go语言提供了一些内置的时间函数和结构体,使得时间的处理变得更加便捷。在本篇文章中,将会介绍一些Go语言中常用的时间处理方式。time.Now()我们可以使用time.Now()函数获取当前的时间:now:=time.Now()fmt.Println(now)输出:2019-06-131

2023年我可以用Java技能申请哪些工作? 2023年我可以用Java技能申请哪些工作? Sep 21, 2023 am 11:41 AM

当我们谈论编程语言和工作时,我们想到的一种编程语言是Java。全世界大多数公司都使用Java。它很受欢迎,而且有很多工作机会。如果您想在2023年借助Java技能找到工作,那么这对您有好处,因为Java技能可以让您快速找到工作。此外,它还能快速提升你的职业生涯。没有什么魔法能让你快速找到工作。但你的技能对你来说就像魔法一样。选择一份让你满意的工作和一个能够极大提升你职业生涯的良好环境。如果你是一个刚入行且有经验的人,Java也给你提供了一份不错的工作。许多公司使用Java作为其开发的主要程序。它

前端工程师职责解析:主要做什么工作? 前端工程师职责解析:主要做什么工作? Mar 25, 2024 pm 05:09 PM

前端工程师职责解析:主要做什么工作?随着互联网的快速发展,前端工程师作为一个非常重要的职业角色,扮演着连接用户与网站应用程序的桥梁,起着至关重要的作用。那么,前端工程师主要做些什么工作呢?本文将对前端工程师的职责进行解析,让我们来一探究竟。一、前端工程师的基本职责网站开发与维护:前端工程师负责网站的前端开发工作,包括编写网站的HTML、CSS和JavaScr

ChatGPT等不会很快接管人类工作,易出错,AI也不会免费打工 ChatGPT等不会很快接管人类工作,易出错,AI也不会免费打工 May 21, 2023 am 08:49 AM

ChatGPT等大模型的相继发布,让很多人倍感压力,害怕AI会很快接管他们的工作。对此,OpenAI也曾发表过一项研究,表明ChatGPT的影响涵盖所有收入阶层,且高收入工作可能面临更大的风险。事实到底如何呢?我们应该将所有的工作,即使是那些令人满意的工作都实现自动智能化吗?这是未来生命研究所(FutureofLifeInstitute)最近提出的几个问题之一,该研究所呼吁暂停大型人工智能实验,目前埃隆・马斯克(ElonMusk)、SteveWozniak和AndrewYang等1万多人均已签署

学java能找什么工作 学java能找什么工作 Jan 16, 2024 pm 05:18 PM

学java能找的工作:1、企业级应用开发;2、网站开发;3、Android开发;4、嵌入式领域;5、大数据与云计算;6、游戏开发;7、科学应用;8、软件开发与维护;9、系统与网络编程;10、安全与加密;11、教育与培训;12、咨询与顾问。详细介绍:1、企业级应用开发,Java在企业级应用开发中占据着非常重要的地位,利用Java,可以开发出各种复杂的企业级应用,如OA系统等等。

学java可以从事哪些工作 学java可以从事哪些工作 Jan 16, 2024 pm 04:58 PM

可从事的工作:1、企业级应用开发;2、网站开发;3、移动应用开发;4、游戏开发;5、大数据分析;6、科学计算与人工智能;7、嵌入式系统开发;8、金融行业应用开发等。详细介绍:1、企业级应用开发:Java在企业级应用开发中占据重要地位,可以用于开发大型、复杂的系统,如ERP、CRM等。这些系统通常需要处理大量数据、支持高并发、保证系统稳定性;2、​网站开发:包括前端和后端等等。

c语言以后做什么工作 c语言以后做什么工作 Jan 29, 2024 pm 02:47 PM

c语言以后可以做的工作:1、系统开发;2、游戏开发;3、网络开发;4、应用开发;5、编译器开发;6、算法工程师;7、网络安全;8、硬件开发;9、教育领域;10、数据分析与机器学习;11、软件开发与维护;​12、软件测试。详细介绍:1、系统开发,C语言是系统级编程的常用语言,可以用于开发操作系统、嵌入式系统,掌握了C语言,可以成为一名系统开发工程师;2、游戏开发等等。

如何删除 Chrome 地址栏中不需要的网址? 如何删除 Chrome 地址栏中不需要的网址? Mar 08, 2024 am 09:19 AM

Chrome会自动在地址栏中记录曾经输入过的网址,并且会在未来自动“联想查询内容”,但很多时候我们并不需要一些网址,如何删掉它们呢?小编经常遇到这样的困扰,曾经输入过的地址,会挡在常用地址的前面,导致需要选好几次才能进入需要的网站。为此我也找过至少3次如何删除了,因为…每次都会忘记。在Chrome官方帮助Chrome键盘快捷键的地址栏快捷键中,就明确了删除快捷键:▍Windows删除地址栏联想内容按向下箭头键以突出显示相应内容,然后按Shift+Delete键▍macOS删除地址栏联想内容按向下

See all articles