如果在建立连接后的一段时间内没有收到数据,那么设置超时关闭 NIO SocketChannel 的最佳方法是什么?
问问题
13600 次
2 回答
10
任何一个:
您正在使用 a
Selector
,在这种情况下,您有一个可以玩的选择超时,如果它熄灭(select(timeout)
返回零),您将关闭所有已注册的频道,或者您正在使用阻塞模式,在这种情况下,您可能认为您应该能够调用
Socket.setSoTimeout()
底层套接字 (SocketChannel.socket()
),并捕获SocketTimeoutException
在read()
源自通道的套接字,或您正在使用没有 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 回答