我是java nio的绿手。
我编写了一个nio服务器,并使用生物套接字客户端连接服务器。当我突然关闭客户端时,以下现象使我感到困惑。
- 客户端将向服务器发送一个[RST,ACK]包。我知道这是一种TCP程序包,但我不理解客户端关闭后如何发送客户端。如果我拔下电缆,客户端仍然可以发送重置软件包吗?
- Nio服务器中的SocketChannel注册SelectionKey.OP_READ操作。当客户端关闭时,select()方法返回(我认为这是不合理的),这意味着我可以从socketChannel读取某些内容。但是,socketChannel无法读取任何内容并引发IOException:远程主机强行关闭了现有连接。因此,一个无限循环开始:select()方法返回,但是socketChannel无法读取(如此矛盾)。通道实际上是关闭的! 为什么客户端关闭会使服务器选择器认为该通道已可供读取?
根据https://stackoverflow.com/a/5638294/9486303,看来我无法通过使用channel.isOpen确定连接是否关闭。 如何在引发异常之前发现通道已关闭?