Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NIO-在服务器端取消注册客户端连接_Java_Sockets_Nio_Channel - Fatal编程技术网

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

Java NIO-在服务器端取消注册客户端连接,java,sockets,nio,channel,Java,Sockets,Nio,Channel,我正在使用选择器和NIO通道编写一个简单的NIO服务器。每次有传入连接时,我都会使用以下代码向选择器注册它: // accept connection SocketChannel client = server.accept(); System.out.println("Accepting connection from " + client.socket().getLocalSocketAddress()); client.configureBlocking(false); clie

我正在使用
选择器和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。发生这种情况时,请关闭通道


注意,您只需关闭频道。取消密钥、注销等操作会自动进行。

大多数情况下都是这样,但坏的网络组件/坏的网络配置可能会在不发送“连接关闭”信号的情况下断开连接(我使用WireShark发现了这一点)。我不得不求助于客户端定期发送ping消息,并在服务器上设置套接字读取超时。但这是用普通套接字I/O和一些客户端完成的,不确定它如何工作/可以与NIO和这么多客户端一起工作。@vanOekel当然可以,但这是另一个问题的答案。要检测TCP中的网络中断,必须发送。在这个问题上,OP似乎认为根本没有任何通知,即使是对于一个有序的近邻。