在java.nio中指定连接超时
使用非阻塞I / O,连接到远程地址的代码如下所示:
SocketChannel channel = SelectorProvider.provider().openSocketChannel(); channel.configureBlocking(false); channel.connect(address);
然后,当某个选择器显示相应的键isConnectable()
时,必须通过在通道上调用finishConnect()
来完成连接过程。
有没有办法在使用这个成语时指定连接超时?
这个问题没有意义。 超时适用于阻止模式。 如果需要,请将通道保留为阻塞模式并调用channel.socket().connect(address, timeout);
。 如果您想要非阻塞模式,请使用当前代码; 然后创建一个选择器; 注册OP_CONNECT
的通道; 当你得到它时,调用finishConnect(),
如果返回true则取消注册OP_CONNECT
并继续执行其余的代码。
有趣的问题。 我不确定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