【问题标题】:How can I detect if a network card is not connected with Java without delay?如何立即检测网卡是否未与 Java 连接?
【发布时间】:2011-08-19 21:39:18
【问题描述】:

Java 中有一个 API(NetworkInterface、InetAddress 等),我可以通过它检测到未连接网卡。

问题是解决某些网络 API 的超时时间很长。但是如果网卡没有连接任何电缆,那么我们可以跳过它。该问题似乎只出现在 Windows 7 中。

【问题讨论】:

  • 很多超时设置都可以在 JVM 级别进行控制(参见 Snicolas 的回复)。其他的,您必须在操作系统级别设置它们,并且您必须为您的 java 应用程序将它们设置为操作系统级别的pre-condition。也许我误解了您的问题,但在我看来,在某些时候,您的 JVM 部署 must 对底层操作系统提供的内容做出了一些假设。好问题(+1 给你)。

标签: java api network-programming


【解决方案1】:

我遇到了同样的问题。我最终使用了这个:

Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
        while(eni.hasMoreElements()) {
            Enumeration<InetAddress> eia = eni.nextElement().getInetAddresses();
            while(eia.hasMoreElements()) {
                InetAddress ia = eia.nextElement();
                if (!ia.isAnyLocalAddress() && !ia.isLoopbackAddress() && !ia.isSiteLocalAddress()) {
                    if (!ia.getHostName().equals(ia.getHostAddress()))
                        return true;
                }
            }
        }

适用于 Java 5+。还间接检查 DNS(通过比较名称/地址)。

【讨论】:

  • 问题是如果未连接网络购物车,getHostName() 会阻塞大约 5 秒。
  • 它不适合我。如果未连接,则主机名与主机地址相同。编辑:再一次,我正在检查 IPv6 堆栈,所以我不确定 IPv4 的行为......不过我认为它会是一样的。
【解决方案2】:

您可以使用一些 java 系统属性来设置套接字连接的默认超时时间

sun.net.client.defaultConnectTimeout

(all properties here)

但在我看来,检查是否存在特定的媒体访问控制器是底层操作系统的工作。我不能告诉你太多关于 Windows 7 的信息,我从 12 年开始就有一个很好的操作系统(linux)。

问候, 斯蒂芬

【讨论】:

  • 我有点同意你的观点(这是操作系统级别的任务,而不是 JVM 的任务。)OTH,如果有人可以尝试在 JVM 级别执行此操作正在实现一个容器或框架(应用级和系统级期望之间的界限变得模糊。)
  • 我认为更改超时不会有帮助。如果您将其设置得太短,那么当存在实际连接延迟时它将超时。但是在某些情况下(例如没有网卡)可能无法连接网络,提问者希望立即检测到。
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多