NIO SocketChannel的读取超时



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

任一:

  1. 您使用的是Selector,在这种情况下,您有一个可以播放的选择超时,如果它熄灭(select(timeout)返回零),您将关闭所有注册的频道或

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

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

因此,您要么需要使用case(1),要么直接使用java.net.Socket

我一直在寻找同样的推荐,但很难找到——在这里分享。

netty有一个很好的处理程序,名为:ReadTimeoutHandler。

人们可以像一样使用它

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

当未能看到任何执行定义的读取超时的数据时,它将删除io.netty.handler.timeout.ReadTimeoutException。

最新更新