3

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

4

2 回答 2

10

任何一个:

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

  2. 您正在使用阻塞模式,在这种情况下,您可能认为您应该能够调用Socket.setSoTimeout()底层套接字 ( SocketChannel.socket()),并捕获SocketTimeoutExceptionread()源自通道的套接字,或

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

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

于 2013-06-27T10:47:28.010 回答
1

我正在寻找相同的建议,但无法轻易找到 - 在这里分享。

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

可以这样使用

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

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

于 2017-09-15T08:35:53.640 回答