學習NIO小結

2021-07-27 11:01:28 字數 2618 閱讀 5905

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