如何设置Java NIO异步SocketChannel连接超时



查看JDK 1.7 API。我似乎无法在AsynchhonousSocketChannel上设置连接超时。

有什么方法可以在这样的频道上设置连接超时吗?

答案是:你不能。

首先要了解的是TCP连接是如何工作的。内核正在发送SYN数据包,从而减少每次重试之间的时间。这可以通过内核参数进行调整。在中可以找到一篇详细介绍这一点的文章(针对linux)

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

使用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注册一个侦听器以进行回调。

最新更新