在Java.nio中指定连接超时时间

7
使用非阻塞I/O,连接到远程地址的代码大致如下:
SocketChannel channel = SelectorProvider.provider().openSocketChannel();
channel.configureBlocking(false);
channel.connect(address);

连接过程必须通过在某个选择器指示相应的键isConnectable()时,在通道上调用finishConnect()来完成。
在使用这种习惯用法时,是否有一种方法可以指定连接超时时间?
2个回答

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中。


-2

这个问题并没有太多意义。超时是用于阻塞模式的。如果你想要这样,就让通道保持在阻塞模式下,并调用 channel.socket().connect(address, timeout);。如果你想要非阻塞模式,请使用你当前的代码;然后创建一个 Selector;将通道注册为 OP_CONNECT;当你得到它时,调用 finishConnect(),如果返回 true,则注销 OP_CONNECT 并继续执行你的代码的其余部分。


1
这个问题是有意义的。启动异步套接字连接并希望它在一定时间内连接或放弃并通过OP_CONNECT告诉您超时是完全可以的。只是nio不公开第二个Socket.connect()参数,所以我认为这不可行通过nio实现。 - Lucio Paiva
@LucioPaiva 你把异步和非阻塞模式混淆了,它们是不同的东西。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接