天天看點

SelectionKey、ServerSocketChannel、SocketChannel常用api

  • SelectionKey
1) SelectionKey,表示 Selector 和網絡通道的注冊關系, 共四種:
    int OP_ACCEPT:有新的網絡連接配接可以 accept,值為 16
    int OP_CONNECT:代表連接配接已經建立,值為 8
    int OP_READ:代表讀操作,值為 1
    int OP_WRITE:代表寫操作,值為 4

# 源碼
public static final int OP_READ = 1 << 0;
public static final int OP_WRITE = 1 << 2;
public static final int OP_CONNECT = 1 << 3;
public static final int OP_ACCEPT = 1 << 4;

# 常用方法
public abstract class SelectionKey {
    public abstract Selector selector();//得到與之關聯的Selector 對象
    public abstract SelectableChannel channel();//得到與之關聯的通道
    public final Object attachment();//得到與之關聯的共享資料
    public abstract SelectionKey interestOps(int ops);//設定或改變監聽事件
    public final boolean isAcceptable();//是否可以 accept
    public final boolean isReadable();//是否可以讀
    public final boolean isWritable();//是否可以寫
}      
  • ServerSocketChannel
1) ServerSocketChannel 在伺服器端監聽新的用戶端 Socket 連接配接
2) 相關方法如下
public abstract class ServerSocketChannel extends AbstractSelectableChannel implements NetworkChannel{
    public static ServerSocketChannel open(),得到一個 ServerSocketChannel 通道
    public final ServerSocketChannel bind(SocketAddress local),設定伺服器端端口号
    public final SelectableChannel configureBlocking(boolean block),設定阻塞或非阻塞模式,取值 false 表示采用非阻塞模式
    public SocketChannel accept(),接受一個連接配接,傳回代表這個連接配接的通道對象
    public final SelectionKey register(Selector sel, int ops),注冊一個選擇器并設定監聽事件
}      
  • SocketChannel
1) SocketChannel,網絡 IO 通道,具體負責進行讀寫操作。NIO 把緩沖區的資料寫入通道,或者把通道裡的資料讀到緩沖區。
2) 相關方法如下
public abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel{
    public static SocketChannel open();//得到一個 SocketChannel 通道
    public final SelectableChannel configureBlocking(boolean block);//設定阻塞或非阻塞模式,取值 false 表示采用非阻塞模式
    public boolean connect(SocketAddress remote);//連接配接伺服器
    public boolean finishConnect();//如果上面的方法連接配接失敗,接下來就要通過該方法完成連接配接操作
    public int write(ByteBuffer src);//往通道裡寫資料
    public int read(ByteBuffer dst);//從通道裡讀資料
    public final SelectionKey register(Selector sel, int ops, Object att);//注冊一個選擇器并設定監聽事件,最後一個參數可以設定共享資料
    public final void close();//關閉通道      

繼續閱讀