初步了解nio,但是一直很難理解。網上看到一篇博文,感覺講的非常好。
nio通訊過程情景模擬
>1.學校(serversocketchannel)
>2.學校教務處(selector)
>3.老師(serversocket)
>4.學生(socketchannel)
>5.員工號/學生號(selectionkey)
學校相當於我們的網路應用程式,一旦開學,學校就不能輕易停止,要一直執行到學期結束
啟動學校就要:
// 新建nio通道老師:相當於服務端的socket,乙個老師對應多個學生,多個學生向老師請教,serversocketchannel serversocketchannel = serversocketchannel.open();
// 使通道為非阻塞
serversocketchannel.configureblocking(false);
老師會一一做出回答,學校要正常執行,當不了老師,所以在開學之前,必須
先聘請專業的老師來學校任教
serversocketchannel.socket().bind(bindaddress, socket_backlog); // 新建socket通道的埠學校教務處:老師有了,但是需要有部門對老師和學生做統一的管理,如果
你去乙個學校找乙個人,實在是找不到了,你可以告訴教務處,那個人是學生,
還是老師,是老師的話,員工編號老師姓名是什麼;是學生的話,學生號,
學生姓名是什麼。教務處就會告訴你,他在那裡。
// 將nio通道繫結到選擇器,繫結後分配的主鍵為keyselectionkey key = serversocketchannel.register(selector, selectionkey.op_accept);
serversocketchannel註冊了選擇器後,學校下面的老師serversocket也就加入了員工冊 。所以老師的編號就是key
學生(相當於client):學校,老師,教務處都有了,現在可以招生了。
如果有學生來報名
while(true)
set selectedkeys = selector.selectedkeys();//獲取通道內關心事件的集合 ,這裡的集合就是老師和學生的編號集合,如果key是學生的,那就是老學生來問問題,如果key是老師的,那就是招生辦的老師帶著乙個新生來註冊
iterator it = selectedkeys.iterator();
while (it.hasnext())
.....
}```
既然有學生來報告,那就有兩種可能,
一種是招生老師帶新生來註冊包名,
一種是老生來問問題。
上面的while(it.hasnext())體可以這麼寫
```
while (it.hasnext()) else if ((key.readyops() & selectionkey.op_read) == selectionkey.op_read)```echobuffer.flip();
system.out.println("limet:" + echobuffer.limit());
byte content = new byte[echobuffer.limit()];
echobuffer.get(content);
string result = new string(content);
dopost(result, sc); //相應老師會去做回答的,細節自己去寫吧
echobuffer.clear();
it.remove(); //任務完成,記得上面也是一樣,要remove掉,否則下一次又來一次任務,就死迴圈了
}} catch (exception e)
}
ssc.register( selector, selectionkey.op_accept );
這個方法是把ssc註冊繫結到選擇器selector 這樣下次你想找ssc或者判斷乙個物件是不是ssc就可以通過selector來查詢,查詢是通過判斷ssc的key得到的。
至於第二個引數selectionkey.op_accept 你可以理解成ssc的key型別或者操作許可權
如果 ssc是學校老師,那麼繫結成功後 老師就擁有了op_accept的許可權或者說他的key型別是selectionkey.op_accept
accept是接受的意思,這是不是很像socket程式設計裡的 accept()方法呢? 是的,沒錯,我們正是通過這個引數給了老師招生和帶學生來註冊的許可權。
而學生呢?
他擁有的許可權為selectionkey.op_read 表示有收發讀取訊息的許可權,即問問題的許可權,因此他不能幫別的學生註冊。
所以你回到上面仔細看看while結構體裡面做了判斷如下:
if ((key.readyops() & selectionkey.op_accept) == selectionkey.op_accept) 很明顯,擁有accept許可權的人只可能是老師,那老師有什麼事會找教務處? 那肯定就是他是招生辦的,招到乙個學生來報名來註冊了。
然後,馬上給這個新連上來的客戶端分配了乙個key
selectionkey newkey = sc.register( selector,
selectionkey.op_read ); 看,這裡只給他op_read,而不是accept哦
另乙個if
else
if((key.readyops() & selectionkey.op_read)== selectionkey.op_read){
//很明顯,這是這學生,因為所有帶op_read的人都是前面由招生辦老師帶過來註冊過的。
NIO通訊示例
讀者可以將 拷貝到編譯器上跑一跑,如果看了注釋還有不懂的地方,可以參考 nio基礎 一 之buffer nio基礎 二 之channel nio基礎 三 之selector 第三篇尤為重要對看懂大體框架有很大意義。public class const 類說明 nio通訊客戶端 public clas...
Mina tcp與NIO通訊問題
1.訊息解碼,編碼問題 開發中,我client用的是mina,服務端是 c 寫的nio,nio中更多是以byte形式來讀與寫.如果用mina與nio進行互動的話,nio可以解碼mina,但是mina卻死活接收不到來自nio的資訊。折騰了好久,最後才找到原因,很簡單。因為如果你用了mina封裝的編碼過...
2 1 NIO網路通訊
selector的應用 非阻塞nio的demo 基於serversocketchannel 非阻塞nio的demo 基於datagramchannel 前文 1.1 nio 和 bio 對比分析,引出 nio 介紹了他們的區別,該篇介紹 如何使用nio進行網路通訊.nio中,執行緒通常將非阻塞 io...