一.SelectableChannel
- SelectableChannel支持阻塞和非阻塞模式的channel
非阻塞模式下的SelectableChannel,讀寫不會阻塞
- SelectableChannel能夠向Selector註冊監聽就緒讀和就緒寫時間,當Selector發現這些時間觸發,就會通知SelectableChannel進行讀寫
- 主要函數
java (1)public SelectableChannel configureBlocking(boolean block):If false then it will be placed non-blocking mode (2)public SelectionKey register(Selector sel, int ops, Object att):
二.ServerSocketChannel
- ServerSocketChannel是ServerSocket的替代類,每一個ServerSocketChannel對象對應一個ServerSocket對象,無構造方法。
- ServerSocketChannel是SelectableChannel的子類
java (1)public static ServerSocketChannel open() // 返回ServerSocketChannel對象,該對象未與任何端口綁定,且處於阻塞模式 (2)serverSocketChannel.socket().bind(int port) // 把ServerSocketChannel綁定到指定端口 (3)public final int validOps() // 返回channel支持的事件,return SelectionKey.OP_ACCEPT;
三.SocketChannel
- SocketChannel是SelectableChannel和ByteChannel的子類
java (1)public static SocketChannel open() (2)public SelectableChannel configureBlocking(boolean block) // 返回channel支持的事件,returnreturn(SelectionKey.OP_READ|SelectionKey.OP_WRITE|SelectionKey.OP_CONNECT); (3)public final int validOps() (4)public abstract boolean isConnectionPending(); //查看該channel上是否有鏈接 /**將字節序列今後通道中讀入給定的緩衝區。 設dst的剩餘容量limit-position爲r,阻塞模式下的讀方法,會嘗試讀到dst的limit位置或讀到輸入流末尾或發生異常,不然一直阻塞 非阻塞模式下,能讀多少度多少,當即返回,不會嘗試讀滿dst再返回 read()方法返回實際上讀入的字節數,可能爲0,可能爲-1,若爲-1,表示讀到了輸入流末尾 */ (5)public int read(ByteBuffer dst) /**將src的內容寫到channel中,設src的有內容的部分limit-position爲r個字節,阻塞模式下,write方法會把r個字節所有寫出才能返回,不然阻塞 非阻塞模式下的write():能輸出多少輸出多少,可能輸出不到r個字節,或輸出了0個字節。非阻塞模式下write方法當即返回 */ (6)public int write(ByteBuffer src) }
四.Selector
- 一旦ServerSocketChannel和SocketChannel向Selector註冊了事件,Selector會監控這些事件是否發生,Selector包含3種SelectionKey集合
(1)all-keys集合:Selector監聽的全部Selectionkey集合,Selector的keys()方法
(2)selected-keys集合:返回已經被Selector捕獲的SelectionKey集合,Selector的selectedKeys()
(3)cancelled-keys集合:已經被取消的SelectionKey集合,沒有方法獲取
- 當SelectableChannel的register(Selector sel, int ops)方法觸發,會新建一個SelectionKey,並把它加入到all-keys集合。若是關閉了與SelectionKey關聯的SelectableChannel對象,或執行了SelectionKey的cancel()方法,則把該key加入到cancelled-keys集合,表示該key對象已經失效,在下次執行Selector的select()方法時,被取消的key對象從全部集合刪除。
- 當執行Selector的select()方法時,若與Selectionkey對象相關的事件發生了,則該key對象就加入到了selected-keys集合。程序直接調用selected-keys集合的remove()方法,或調用它的iterator的remove(),都能從selected-keys集合中刪除這個key對象,但不容許調用集合接口的remove()方法從all-keys中刪除key對象,不然跑出UnsopportException
(1)public static Selector open() //Opens a selector
(2)public Set<SelectionKey> keys() //返回Selector的all-keys集合(UnmodifiableSet)
(3)public int selectNow() //返回相關事件已發生的SelectionKey對象數目,採用非阻塞方式,若是沒有就返回0
/**採用阻塞方式,返回已發生的Selectionkey個數,若是一個也沒有,就進入阻塞模式,除非其餘線程調用了selector.wakeup()*/
(4)public int select()