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

时间:2012-12-13 19:38:08

标签: 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

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

的内容
client.deregister(mySelector);

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

2 个答案:

答案 0 :(得分:21)

在选择键上调用cancel()

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

...
SelectionKey key = client.keyFor(mySelector);
key.cancel();

答案 1 :(得分:3)

除了@Nikolai的回答。执行<Directory /var/www/html/> SetEnvIfNoCase Host example\.com VALID_HOST Require env VALID_HOST Options </Directory> 也会取消注册频道。

  

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

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