8

这是一个非常直接的问题,但我发现需要取消注册一个选择器,它可以俯瞰我的 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

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

client.deregister(mySelector);

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

4

2 回答 2

25

调用cancel()选择键:

SelectionKey key = client.register(mySelector,
    SelectionKey.OP_READ | SelectionKey.OP_WRITE);
...
key.cancel();

或者

...
SelectionKey key = client.keyFor(mySelector);
key.cancel();
于 2012-12-13T20:04:13.293 回答
4

除了@Nikolai 的回答。这样做client.close()也会取消注册频道。

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

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

于 2016-10-04T22:17:55.420 回答