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();
}
}
}
在代碼中能夠處理具體需求。