我正在使用选择器
和NIO channel 编写一个简单的NIO服务器。每次有传入连接时,我都会使用以下代码将其注册到选择器:
// accept connection
SocketChannel client = server.accept();
System.out.println("Accepting connection from " + client.socket().getLocalSocketAddress());
client.configureBlocking(false);
client.socket().setTcpNoDelay(true);
client.register(selector, SelectionKey.OP_READ);
在客户端,由于我只有一个 socketChannel,因此很容易关闭 channel 并取消注册选择器。然而,在服务器端,我所做的只是等待任何曾经连接过的客户端(可能是数千个)的写入。我有办法检测客户端在服务器端已断开连接吗?看起来选择器在例如之后会变得非常低效。 10K 连接,其中大部分可能会在不久后消失..
最佳答案
当客户端断开连接时,服务器将获取该 channel 的 OP_READ 事件,并且 read() 将返回 -1。发生这种情况时,请关闭 channel 。
注意您只需关闭 channel 即可。取消 key 、注销等都会自动发生。
关于Java NIO - 在服务器端取消注册客户端连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24573136/