读取NIO SocketChannel的超时时间?
如果在建立连接后的一段时间内没有收到数据,那么设置超时以关闭NIO SocketChannel的最佳方法是什么?
或者:
-
您正在使用
Selector
,在这种情况下,您可以使用选择超时,如果它关闭(select(timeout)
返回零),您将关闭所有已注册的通道,或者 -
您正在使用阻塞模式,在这种情况下,您可能认为您应该能够在底层套接字(
SocketChannel.socket()
)上调用Socket.setSoTimeout()
),并捕获在read()
期间超时到期时抛出的SocketTimeoutException
,但你不能,因为它不支持源自通道的套接字,或 -
您正在使用没有
Selector
的非阻塞模式,在这种情况下,您需要更改为大小写(1)。
所以你需要直接使用case(1)或java.net.Socket
。
我一直在寻找相同的建议,但却无法轻易找到 – 在这里分享。
有一个很好的netty处理程序叫做:ReadTimeoutHandler。
人们可以这样使用它
channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));
当无法看到任何数据执行定义的读取超时时,它将丢弃io.netty.handler.timeout.ReadTimeoutException。