读取NIO SocketChannel的超时时间?

时间:2013-06-27 10:41:22

标签: java nio socketchannel

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

2 个答案:

答案 0 :(得分:6)

或者:

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

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

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

  4. 因此您需要直接使用案例(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。