首页 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

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

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

前端工程师职责解析:主要做什么工作?

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

2023年我可以用Java技能申请哪些工作?

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

ChatGPT等不会很快接管人类工作,易出错,AI也不会免费打工

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

学java能找什么工作

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

学java可以从事哪些工作

Go 语言中的时间处理方式有哪些? Go 语言中的时间处理方式有哪些? Jun 10, 2023 pm 09:42 PM

Go 语言中的时间处理方式有哪些?

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

c语言以后做什么工作

Hibernate二级缓存是如何工作的? Hibernate二级缓存是如何工作的? Sep 14, 2023 pm 07:45 PM

Hibernate二级缓存是如何工作的?

See all articles