NIO中的SelectionKey
生活随笔
收集整理的這篇文章主要介紹了
NIO中的SelectionKey
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自: 秦漢郵俠 https://www.jianshu.com/p/d33f2f6cdba0
要點
- 是一個抽象類,表示selectableChannel在Selector中注冊的標識.每個Channel向Selector注冊時,都將會創建一個selectionKey
- 選擇鍵將Channel與Selector建立了關系,并維護了channel事件.
- 可以通過cancel方法取消鍵,取消的鍵不會立即從selector中移除,而是添加到cancelledKeys中,在下一次select操作時移除它.所以在調用某個key時,需要使用isValid進行校驗.
操作集
- interest 集合:當前channel感興趣的操作,此類操作將會在下一次選擇器select操作時被交付,可以通過selectionKey.interestOps(int)進行修改.
- ready 集合:表示此選擇鍵上,已經就緒的操作.每次select時,選擇器都會對ready集合進行更新;外部程序無法修改此集合.
操作屬性
- OP_ACCEPT:連接可接受操作,僅ServerSocketChannel支持
- OP_CONNECT:連接操作,Client端支持的一種操作
- OP_READ/OP_WRITE
0表示什么?
- 這些opts都不為0,如果向selector之中register一個為“0”的opts,表示此channel不關注任何類型的事件。(言外之意,register方法只是獲取一個selectionKey,具體這個Channel對何種事件感興趣,可以在稍后操作)
方法列表
- public abstract SelectableChannel channel():返回此選擇鍵所關聯的通道.即使此key已經被取消,仍然會返回.
- public abstract Selector selector():返回此選擇鍵所關聯的選擇器,即使此鍵已經被取消,仍然會返回.
- public abstract boolean isValid():檢測此key是否有效.當key被取消,或者通道被關閉,或者selector被關閉,都將導致此key無效.在AbstractSelector.removeKey(key)中,會導致selectionKey被置為無效.
- public abstract void cancel():請求將此鍵取消注冊.一旦返回成功,那么該鍵就是無效的,被添加到selector的cancelledKeys中.cancel操作將key的valid屬性置為false,并執行selector.cancel(key)(即將key加入cancelledkey集合)
- public abstract int interesOps():獲得此鍵的interes集合.
- public abstract SelectionKey interestOps(int ops):將此鍵的interst設置為指定值.此操作會對ops和channel.validOps進行校驗.如果此ops不會當前channel支持,將拋出異常.
- public abstract int readyOps():獲取此鍵上ready操作集合.即在當前通道上已經就緒的事件.
- public final boolean isReadable(): 檢測此鍵是否為"read"事件.等效于:k.,readyOps() & OP_READ != 0;還有isWritable(),isConnectable(),isAcceptable()
- public final Object attach(Object ob):將給定的對象作為附件添加到此key上.在key有效期間,附件可以在多個ops事件中傳遞.
- public final Object attachment():獲取附件.一個channel的附件,可以再當前Channel(或者說是SelectionKey)生命周期中共享,但是attachment數據不會作為socket數據在網絡中傳輸.
參考代碼
- Reactor
- Handler
參考來源
- Selector類詳解
總結
以上是生活随笔為你收集整理的NIO中的SelectionKey的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NIO与零拷贝
- 下一篇: NIO网络编程实战之简单多人聊天室