有没有办法在套接字通道上取消注册选择器

Dr.*_*all 8 java sockets select nonblocking socketchannel

这是一个非常直截了当的问题,但我发现需要取消注册选择器,忽略我的套接字通道的java.

SocketChannel client = myServer.accept(); //forks off another client socket
client.configureBlocking(false);//this channel takes in multiple request
client.register(mySelector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);//changed from r to rw
Run Code Online (Sandbox Code Playgroud)

我可以在以后的程序中调用类似的东西

client.deregister(mySelector);
Run Code Online (Sandbox Code Playgroud)

并且选择器将不再捕获该套接字通道的数据键.鉴于我的服务器/客户端设计,这将使我的生活更轻松.

Nik*_*sov 22

调用cancel()选择键:

SelectionKey key = client.register(mySelector,
    SelectionKey.OP_READ | SelectionKey.OP_WRITE);
...
key.cancel();
Run Code Online (Sandbox Code Playgroud)

要么

...
SelectionKey key = client.keyFor(mySelector);
key.cancel();
Run Code Online (Sandbox Code Playgroud)


gok*_*_uf 5

除了@Nikolai 的回答。这样做client.close()还将取消注册该通道。

当取消键时,无论是通过关闭其通道还是通过调用其取消方法,键都会添加到其选择器的取消键集中。

来自https://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html