NIO 入門例項

2021-10-17 08:38:14 字數 1927 閱讀 9462

1.2.4 入門示例

1.2.4.1 服務端

流程

建立serversocketchannel/非阻塞 /繫結埠

serversocketchannel serversocketchannel = serversocketchannel.

open()

;serversocketchannel.

configureblocking

(false);

//設定為非阻塞

serversocketchannel.

socket()

.bind

(new

inetsocketaddress

(6666))

;//繫結6666埠,伺服器端監聽

註冊到selector

selector selector = selector.

open()

;serversocketchannel.

register

(selector, selectionkey.op_accept)

;//關心管道的op_accept

等待迴圈

while

(true

)

如果有事件,則獲取selectionkey
set

selectionkeys = selector.

selectedkeys()

;

遍歷這個set

iterator

keyiterator = selectionkeys.

iterator()

;while

(keyiterator.

hasnext()

)

如果是讀取事件,根據key獲取channel,然後獲取buffer

if

(key.

isreadable()

)

每一次使用完key要手動刪除,防止重複操作

keyiterator.

remove()

;//主動移除key,防止重複操作

}}

1.2.4.2 客戶端

非阻塞通道,並且填入伺服器ip和埠

socketchannel socketchannel = socketchannel.

open()

;socketchannel.

configureblocking

(false);

inetsocketaddress inetsocketaddress =

newinetsocketaddress

("127.0.0.1"

,6666);

//伺服器端ip與埠

非阻塞連線

if

(!socketchannel.

connect

(inetsocketaddress)

)}

通過管道傳送緩衝區裡的資料

string str =

"hello 50hz"

; bytebuffer bytebuffer = bytebuffer.

wrap

(str.

getbytes()

);//包乙個位元組陣列到buffer

socketchannel.

write

(bytebuffer)

; system.in.

read()

;

五 NIO應用 群聊例項

例項要求 編寫乙個 nio 群聊系統,實現伺服器端和客戶端之間的資料非阻塞簡單通訊 實現多人群聊,單人群聊 伺服器端 可以監測使用者上線,離線,並實現訊息 功能 客戶端 通過channel可以無阻塞傳送訊息給其它所有使用者,同時可以接受其它使用者傳送的訊息 有伺服器 得到 public class ...

NIO入門 快取與對映

nio歸根結底就是使用通道的快取與對映,以實現輸入源與輸出源的操作簡化。此篇不涉及web端的nio開發 選擇器 就緒載入 管道 要想理解nio的快取機制,就必須要了解三個引數 引數含義 capacity 緩衝區陣列的總長度 position 下乙個要操作的資料元素的位置 limit 而通道本身是用以...

NIO學習一 NIO簡介

最近在學習nio,根據學習總結了一下,如果有不對的地方,請大佬指出。nio,就是new io,從jdk 1.4開始引入的新的api,它跟io的作用相同。它與傳統的io相比,有如下特性 1 nio是面向緩衝區的,io是面向流的。2 io是阻塞的操作,如果乙個io的read或者write沒有得到資料的時...