如果在建立连接后的一段时间内没有收到数据,设置关闭NIO SocketChannel的超时的最佳方法是什么?
答案 0 :(得分:6)
或者:
您正在使用Selector
,在这种情况下,您可以使用选择超时,如果它已关闭(select(timeout)
返回0),则关闭所有已注册的频道,或
您正在使用阻止模式,在这种情况下,您可能认为应该能够在底层套接字(Socket.setSoTimeout()
)上调用SocketChannel.socket()
,并捕获SocketTimeoutException
在read()
期间超时到期时抛出,但您不能,因为它不支持作为通道发起的套接字,或
您正在使用不带Selector
的非阻止模式,在这种情况下,您需要更改为大小写(1)。
因此您需要直接使用案例(1)或java.net.Socket
。
答案 1 :(得分:1)
我一直在寻找同样的建议而且找不到 - 在这里分享。
有一个很好的netty处理程序叫做:ReadTimeoutHandler。
可以像那样使用它
declare function local:clarkName($name as xs:QName) {
"{"||namespace-uri-from-QName($name)||"}"||local-name-from-QName($name)
};
let $doc := document{<a><b/><b/><c xmlns="c.com"/></a>}
for $node in $doc//*
group by $name := node-name($node)
return local:clarkName($name) || ":" || count($node)
如果没有看到任何数据执行定义的读取超时,它将丢弃io.netty.handler.timeout.ReadTimeoutException。