在java.nio中指定连接超时

时间:2010-04-01 21:53:02

标签: java timeout connection nio

使用非阻塞I / O,连接到远程地址的代码如下所示:

SocketChannel channel = SelectorProvider.provider().openSocketChannel();
channel.configureBlocking(false);
channel.connect(address);

当某个选择器显示相应的键finishConnect()时,必须通过在频道上调用isConnectable()来完成连接过程。

有没有办法在使用这个成语时指定连接超时?

2 个答案:

答案 0 :(得分:1)

这个问题确实没有意义。超时适用于阻止模式。如果您需要,请将频道保留为阻止模式,然后拨打channel.socket().connect(address, timeout);。如果您想要非阻塞模式,请使用当前代码;然后创建一个选择器;注册OP_CONNECT的频道;当你得到它时,请调用finishConnect(),,如果返回true则取消注册OP_CONNECT并继续使用其余代码。

答案 1 :(得分:0)

有趣的问题。我不确定nio本身是否提供了解决方案。

根据我的经验,我运行Callable来尝试连接,然后使用Future来轮询响应,使用'interval'和'timeout'变量循环,使用Thread.sleep()来响应。

希望这能为您指明一个有用的方向......

另外,我建议你看看Apache Mina(你可以将Mina描述为一个nio框架)。它为你处理了很多这样的东西,比如在StreamIoHandler http://mina.apache.org/report/trunk/apidocs/org/apache/mina/handler/stream/StreamIoHandler.html