gpt4 book ai didi

java - 如何设置Java NIO AsynchronousSocketChannel连接超时

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:34 25 4
gpt4 key购买 nike

查看 JDK 1.7 API。我似乎无法在 AsynchonousSocketChannel 上设置连接超时。无论如何我可以在这样的 channel 上设置连接超时吗?

谢谢。

最佳答案

答案是:你不能。

首先要了解 TCP 连接的工作原理。内核正在发送 SYN 数据包,回退每次重试之间的时间。这可以通过内核参数进行调整。可以找到一篇详细介绍此内容的文章(适用于 Linux)here

为了让您了解为套接字连接实现您自己的更短超时所涉及的内容是将套接字置于非阻塞模式,将其放入 select() 超时,然后使用 getsockopt() 查看发生了什么。 This StackOverflow answer显示这是如何工作的。

在 NIO.2 中,连接过程是使用您无权访问的线程为您处理的。不幸的是,没有办法告诉它你想要更短的连接超时;它只是在连接成功或失败(包括超时)时调用您的完成处理程序/通知 Future

您可以选择在返回的 Future 上调用 get(timeout, unit),然后在超时时取消 Future ...但这意味着如果您希望连接是异步的,您必须添加另一层线程/回调,并且也可以使用 nio 实现您自己的异步。

由于您正在查看异步网络内容,最后值得一提的是 Netty确实给了你这个(使用 Nio):

Bootstrap bootstrap = new Bootstrap()
.group(new NioEventLoopGroup())
.channel(NioSocketChannel.class)
.remoteAddress(new InetSocketAddress(remoteAddress, port))
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout);

ChannelFuture f = bootstrap.connect();

并且您可以向该 ChannelFuture 注册一个监听器以进行回调。

关于java - 如何设置Java NIO AsynchronousSocketChannel连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20752756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com