nio(同步非阻塞)在jdk1.4時推出,和傳統的io(同步阻塞)比較有著新的思想,在網上學習和整理知識點時知道學習nio可分為3個部分
1.channel:通道,資料的讀取和寫入都可以通過它來完成。
2.selector :選擇器,用於選擇註冊在通道中的已發生的事件。
3.bytebuffer:乙個新的緩衝區,通過這個類我們可以在通道中做寫操作和讀操作;主要是通過position、limit、和capacity指標的位置來進行操作。
對於以上3部分我就不做過多的解釋了,感興趣的同學可以找找其他文章,他們解釋已經很詳細了。
下面是我自己參照網上資料做的小練習,有比較詳細的注釋:
nio的服務端,大概分一下幾個步驟:
a.建立乙個選擇器selector,開啟通道channel。
b.設定此通道為非阻塞的,並繫結監聽埠。
c.因為一開始需要和客服端連線才能做後面的操作,我們可以只註冊accept事件,而這個事件在客服端只在連線時觸發,所以可以在accept的處理方法中再註冊其他的事件。
d.使用selector的select方法,這個方法會選擇那些資料已經準備好的事件,(如果沒有任何事件中的資料準備好那他其實是阻塞的),之後就是處理對應的事件的邏輯了
e.關閉通道。
這裡需要注意的是通道中事件的更換,這裡有乙個問題,如果通道中你沒有註冊任何事件,那麼會造成死迴圈。剩下的注釋在**中可參照。
public class mythreadnioechoserver else if (sk.isvalid() && sk.isreadable()) else if (sk.isvalid() && sk.iswritable())
}} }
/*** 向通道中寫資料
* @param sk
*/private void dowrite(selectionkey sk)
} catch (exception e)
sk.interestops(selectionkey.op_read);//更換到read事件,不然會一直是write事件,造成死迴圈
} /**
* 讀取通道中的資料
* @param sk
*/private void doread(selectionkey sk) else
}system.out.println("客服端說:"+new string(buf.tostring().getbytes(),"utf-8"));
if (len < 0)
} catch (exception e)
// sk.interestops(selectionkey.op_read); //
} private void disconnect(selectionkey sk) catch (exception e)
} private void doaccept(selectionkey sk)
}bytebuffer bb = (bytebuffer) clientkey.attachment();
bb.put("".getbytes());
while(true) catch (exception e) }}
});} catch (exception e)
} public static void main(string args) catch (exception e)
}}
nio的客服端,這個類中和上乙個服務端是差不多的步驟,下面是**:這裡需要注意的是,通道其實是可以寫入的,我們其實不需要進行註冊,如果註冊了處理不好會造成死迴圈,像上面的服務端一樣,註冊了write,如果沒有在dowrite方法中註冊了read事件,那麼就是會死迴圈。
public class clientsocketchannel
public static void startchannelconection() catch (exception e) }}
}).start();
next.interestops(selectionkey.op_read);
}else if(next.isvalid()&&next.isreadable())else
}system.out.println(new string(buffer.tostring().getbytes(), "utf-8"));
} catch (exception e)
// next.interestops(selectionkey.op_read);
}else if(next.iswritable())}}
}} catch (exception e)
}}
下面是服務端和客服端執行結果:
先執行服務端,在執行客服端,
這個簡單的通訊其實存在很大問題,比如是否有粘包,半包等問題,所以寫出乙個高可用的nio是非常不易的,但是netty框架似乎已經幫我們解決了這些問題。大家有興趣可以進行了解。
NIO使用小結
所謂的nio,是new io的縮寫,它提供了buffer的功能來提交io的效能。jdk從1.4之後開始提供相關操作。基本結構 buffer抽象類的一系列子類實現,其中booleanbuffer不存在,也沒必要緩衝。具體如下 bytebuffer,byteorder,charbuffer,double...
NIO學習一 NIO簡介
最近在學習nio,根據學習總結了一下,如果有不對的地方,請大佬指出。nio,就是new io,從jdk 1.4開始引入的新的api,它跟io的作用相同。它與傳統的io相比,有如下特性 1 nio是面向緩衝區的,io是面向流的。2 io是阻塞的操作,如果乙個io的read或者write沒有得到資料的時...
NIO學習總結
使用傳統的i o讀取檔案內容 param filepath 檔案路徑 throws ioexception public static void ioread string filepath throws ioexception 使用nio讀取檔案內容 param filepath 檔案路徑 thr...