Java NIO 基本使用

NIO如今有NIO 2了,新版本有对MulticastSocket的支持。这篇对NIO使用作些简单的记录以备后用。 socket

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

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

ServerSocketChannel负责监听传入的链接和建立新的SocketChannel对象,自己不传递数据;SocketChannel和DatagramChannel负责定义读和写功能的接口。 接口

下面是基本的使用代码: 事件

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

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

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

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

...... io

 

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();

           }

      }

}

在代码中能够处理具体需求。

相关文章
相关标签/搜索