展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

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();//关闭通道
posted @ 2022-08-05 11:55  DogLeftover  阅读(13)  评论(0编辑  收藏  举报