这是一个非常直截了当的问题,但我发现需要取消注册选择器,忽略我的套接字通道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);
并且选择器将不再捕获该套接字通道的数据键。考虑到我的服务器/客户端设计,这将使我的生活更加轻松。
答案 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