nio通訊過程

2021-08-22 15:02:20 字數 2867 閱讀 9091

初步了解nio,但是一直很難理解。網上看到一篇博文,感覺講的非常好。

nio通訊過程情景模擬

>1.學校(serversocketchannel)

>2.學校教務處(selector)

>3.老師(serversocket)

>4.學生(socketchannel)

>5.員工號/學生號(selectionkey)

學校相當於我們的網路應用程式,一旦開學,學校就不能輕易停止,要一直執行到學期結束

啟動學校就要:

// 新建nio通道

serversocketchannel serversocketchannel = serversocketchannel.open();

// 使通道為非阻塞

serversocketchannel.configureblocking(false);

老師:相當於服務端的socket,乙個老師對應多個學生,多個學生向老師請教,

老師會一一做出回答,學校要正常執行,當不了老師,所以在開學之前,必須

先聘請專業的老師來學校任教

serversocketchannel.socket().bind(bindaddress, socket_backlog); // 新建socket通道的埠
學校教務處:老師有了,但是需要有部門對老師和學生做統一的管理,如果

你去乙個學校找乙個人,實在是找不到了,你可以告訴教務處,那個人是學生,

還是老師,是老師的話,員工編號老師姓名是什麼;是學生的話,學生號,

學生姓名是什麼。教務處就會告訴你,他在那裡。

// 將nio通道繫結到選擇器,繫結後分配的主鍵為key

selectionkey 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...