在不关闭底层 TCP 套接字的情况下关闭 Java NIO 套接字通道

Close a Java NIO Socket Channel without closing the underlying TCP Socket

关闭特定的 ChannelSocket 实际上也会关闭 TCP 套接字。即使 keep-alive 设置为 true。

val socketChannel = selectionKey.channel().asInstanceOf[SocketChannel]

socketChannel.socket().setKeepAlive(true)

socketChannel.close()

println("Socket closed?", socketChannel.socket().isClosed) // prints true

我只是想关闭套接字通道,这样我就不想在这个通道上监听更多的事件。但我想保持连接打开。

我能够使用每个 SelectionKey 上可用的 interestOps 方法解决这个问题。

如果您不想再监听任何事件,您可以使用 interestOps(0)

val socketChannel = selectionKey.channel().asInstanceOf[SocketChannel]

socketChannel.socket().setKeepAlive(true)
// socketChannel.close()

selectionKey.interestOps(0) // Stops listening on events

println("Socket closed?", socketChannel.socket().isClosed) // prints false