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