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

           }

      }

}

在代碼中能夠處理具體需求。

相關文章
相關標籤/搜索