在 java.nio 中指定连接超时

Posted

技术标签:

【中文标题】在 java.nio 中指定连接超时【英文标题】:Specify connection timeout in java.nio 【发布时间】:2011-02-03 13:41:11 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

有趣的问题。我不确定 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);。如果您想要非阻塞模式,请使用您当前的代码;然后创建一个选择器;注册OP_CONNECT的频道;当你得到它时调用finishConnect(),,如果返回true,则注销OP_CONNECT并继续你的其余代码。

【讨论】:

这个问题确实有道理。启动异步套接字连接并希望它在一定时间内连接或放弃并告诉您(通过 OP_CONNECT)它已超时,这完全没问题。只是nio没有暴露第二个Socket.connect()参数,所以我认为通过nio这是不可行的。

以上是关于在 java.nio 中指定连接超时的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring data jpa查询中指定@lock超时?

/etc/resolv.conf 中指定的超时值会做啥?

在 Spring Boot 和 Spring WebFlux (Netty) 中指定服务器请求超时

Hystrix 和 http sink(连接池)一起工作

在 Spring MVC 中设置会话超时

Java NIO Socket编程实例