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沒有得到資料的時...