[英]Java NIO - deregister client connection on server side
我正在使用Selectors
和NIO通道编写一个简单的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,因此很容易简单地关闭通道并向选择器注销。 然而,从另一方面说,我正在做的就是等待任何曾经连接过的客户端(可能数千个)的写入。 我使用了一种方法来检测客户端在服务器端已断开连接? 似乎选择器在经过10K个连接后会变得非常低效,其中大部分可能会在不久后消失。
当客户端断开连接时,服务器将获得该通道的OP_READ事件,而read()将返回-1。 发生这种情况时,请关闭通道。
注意您只需要关闭频道。 取消密钥,注销等会自动发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.