读取NIO SocketChannel的超时时间?

如果在建立连接后的一段时间内没有收到数据,那么设置超时以关闭NIO SocketChannel的最佳方法是什么?

或者:

  1. 您正在使用Selector ,在这种情况下,您可以使用选择超时,如果它关闭( select(timeout)返回零),您将关闭所有已注册的通道,或者

  2. 您正在使用阻塞模式,在这种情况下,您可能认为您应该能够在底层套接字( SocketChannel.socket() )上调用Socket.setSoTimeout() ),并捕获在read()期间超时到期时抛出的SocketTimeoutException ,但你不能,因为它不支持源自通道的套接字,或

  3. 您正在使用没有Selector的非阻塞模式,在这种情况下,您需要更改为大小写(1)。

所以你需要直接使用case(1)或java.net.Socket

我一直在寻找相同的建议,但却无法轻易找到 – 在这里分享。

有一个很好的netty处理程序叫做:ReadTimeoutHandler。

人们可以这样使用它

 channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout)); 

当无法看到任何数据执行定义的读取超时时,它将丢弃io.netty.handler.timeout.ReadTimeoutException。