在不关闭底层 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
关闭特定的 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