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

来自Netty系列教程:http://www.coderli.com/netty-nio-selector

 

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

 

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

 

 
Selector服务端样例代码:
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
  * Java NIO Select模式服务端样例代码
  *
  * @author lihzh
  * @alia OneCoder
  * @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客户端样例代码:
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
/**
  * Java NIO Selector模式,客户端代码
  *
  * @author lihzh
  * @alia OneCoder
  */
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"信息。
 
简单概括就是,整一个通道,通道加个选择过滤器,看来的事件是不是我想要的,不想要的干脆不管,想要的,我就存起来,留着慢慢处理。

你可能感兴趣的:(java NIO)