Java NIO - 在服务器端取消注册客户端连接

标签 java sockets nio channel

我正在使用选择器和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/

相关文章:

java - JFrame 内存泄漏

java - java SE 或 jaxb 中的 JSR 303 Bean 验证

javascript - 每个聊天室 javascript 的 socket.io 端口

sockets - 带多宿主的 SCTP 作为 TCP 的直接替代

java - 如何使用 NIO 从 gzip 文本文件中逐行读取文本数据?

java - 原始变量比其关联的包装类执行计算更快

java - 两种身份验证机制 : Kerberos and HTTP basic

javascript - 如何使用RtcPeerConnection与其他实例连接?

java - Linux 上的 FileChannel.write 会产生大量垃圾,但在 Mac 上不会

java - 非阻塞模式下的 ServerSocketChannel 未正确关闭