查看JDK 1.7 API。我似乎无法在AsynchonousSocketChannel上设置连接超时。无论如何我可以在这样的频道上设置连接超时吗?
感谢。
答案 0 :(得分:6)
答案是:你做不到。
首先要了解的是TCP连接的工作原理。内核正在发送SYN数据包,在每次重试之间退出时间。这可以通过内核参数进行调整。可以找到一篇详细介绍此内容的文章(适用于linux)here
为了让您了解为套接字连接实现自己的更短超时所涉及的是将套接字置于非阻塞模式,将其置于select()
超时,然后使用getsockopt()
查看发生的情况。 This StackOverflow answer显示了这是如何运作的。
使用NIO.2,可以使用您无权访问的线程为您处理连接过程。不幸的是,没有办法告诉你你想要更短的连接超时;它只是调用你的完成处理程序/当连接成功失败(包括超时)时通知Future
。
您可以选择在返回的get(timeout, unit)
上调用Future
,然后在超时时取消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
注册一个用于回调的侦听器。