Java NIO 基本使用

NIO现在有NIO 2了,新版本有对MulticastSocket的支持。这篇对NIO使用做些简单的记录以备后用。

ServerSocketChannel,SocketChannel,DatagramChannel是常见的三个功能类,称为通道类,可以运行非阻塞模式并且是可以选择的。在Socket通信中,“阻塞”意味着在某操作没有完成之间,不能进行其它操作。因此,对于多客户端来说,服务端需要为每一个客户端创建一个线程处理用户需求,这样消耗比较大。

在NIO中,使用Selector对象对向它注册过的channel进行轮询,一次轮询返回所有注册事件发生的channel的key。用一个迭代器,我们可以在一次轮询中处理相关的channel请求。

ServerSocketChannel负责监听传入的连接和创建新的SocketChannel对象,本身不传递数据;SocketChannel和DatagramChannel负责定义读和写功能的接口。

下面是基本的使用代码:

Selector selector=Selector.open();//该方法打开一个选择器

SocketChannel channel=SocketChannel.open(new InetSocketAddress(ip,port));

channel.configureBlocking(false);//设置为非阻塞模式

SelectionKey channelkey=channel.register(selector,SelectionKey.OP_READ);//channelkey可以在下面的轮询中来分别出是哪一个具体的channel,从而可以进行特定的操作

......

 

DatagramChannel的用法基本相同,datagramchannel用于非连接,socketchannel用于连接

具体轮询的代码如下:

while(true){

      if (selector.select(getTimeout()) != 0) {//getTimeout()为超时时间
           Iterator<SelectionKey> it = selector.selectedKeys().iterator();

           while (it.hasNext()) {
               SelectionKey key = it.next();

               if(key.isReadable()){

                   ......

               }

               if(key.isWritable()){

                   ......

               }

               if(key.isAcceptable()){

                   ......

               }

               it.remove();

           }

      }

}

在代码中可以处理具体需求。

你可能感兴趣的:(Java NIO 基本使用)