【问题标题】:Getting the computer name in Java [duplicate]在Java中获取计算机名称[重复]
【发布时间】:2011-12-14 13:47:52
【问题描述】:

我想知道是否有办法在 Java 中获取计算机名称?我见过几个以java.net.InetAddress 为特色的答案。但是我想知道是否有不使用网络的方法?

(作为一个附带问题,计算机名称是否只是网络事物,因此必须这样做??)

【问题讨论】:

  • 你只是在真正使用环回接口,又名localhost
  • 给不在网络上的计算机命名就像给猫命名一样——除了当你叫它时它不会无视你,而是没有人在叫它。
  • @JonathanSpooner - 呃,我们的生产机器因此在 /etc/hosts 中有它们的真实名称。我没有回来'localhost';)
  • 见鬼 - 你把它命名为5。随后的猫应该被命名为5e6 ;) (虽然我想如果你是老派,你可以命名一只TenBaseTee

标签: java


【解决方案1】:

计算机“名称”由操作系统的底层 DNS(域名系统)库从 IP 地址解析。没有跨操作系统的计算机名称的通用概念,但 DNS 普遍可用。如果尚未配置计算机名称以便 DNS 可以解析它,则它不可用。

import java.net.InetAddress;
import java.net.UnknownHostException;

String hostname = "Unknown";

try
{
    InetAddress addr;
    addr = InetAddress.getLocalHost();
    hostname = addr.getHostName();
}
catch (UnknownHostException ex)
{
    System.out.println("Hostname can not be resolved");
}

【讨论】:

  • 我想知道当 OP 要求解决方案时,这怎么能成为公认的答案:“一种不使用网络的方式?”
  • 在 Mac OS X 上,此解决方案可能会提供不同的主机名,具体取决于计算机是否连接到网络
【解决方案2】:

我同意 peterh 的回答,所以对于那些喜欢复制和粘贴而不是多花 60 秒谷歌搜索的人:

private String getComputerName()
{
    Map<String, String> env = System.getenv();
    if (env.containsKey("COMPUTERNAME"))
        return env.get("COMPUTERNAME");
    else if (env.containsKey("HOSTNAME"))
        return env.get("HOSTNAME");
    else
        return "Unknown Computer";
}

我已经在 Windows 7 中对此进行了测试,并且可以正常工作。如果 peterh 是对的,else if 应该负责 Mac 和 Linux。也许有人可以测试这个?如果您想要额外的稳健性,您也可以在 else 中实现 Brian Roach 的答案。

【讨论】:

  • 至少对于 Ubuntu 14.04,这是行不通的。出现计算机名称的唯一环境变量是SESSION_MANAGER 变量。但是你需要解析它,因为它看起来像这样:local/&lt;&lt;name&gt;&gt;:@/tmp/.ICE-unix/2131,unix/&lt;&lt;name&gt;&gt;:/tmp/.ICE-unix/2131
  • 如果您发出“export HOSTNAME”,那么环境变量将被传递给子任务。
  • 彼得在这里。感谢您的实施。对于 Unix/Linux 和 Sharcoux 的评论,我已更新 my answer
  • 作为 Ubuntu 上的替代方案,可以捕获主机名命令的输出...
  • 我宁愿做函数public static
【解决方案3】:

我对@9​​87654326@ 解决方案并不那么兴奋,因为您可以在 Internet 上找到如此多的地方,实际上也可以在这里找到。从网络角度来看,该方法将为您提供主机名。我可以看到两个问题:

  1. 如果主机有多个网络接口怎么办?主机在网络上可能有多个名称。所述方法返回的那个是不确定的afaik。

  2. 如果主机没有连接到任何网络并且没有网络接口怎么办?

我所知道的所有操作系统都有命名节点/主机的概念,而与网络无关。遗憾的是 Java 不能以简单的方式返回它。这将是所有 Windows 版本上的环境变量 COMPUTERNAME 和 Unix/Linux/MacOS 上的环境变量 HOSTNAME(或者,如果 HOSTNAME 环境变量不可用,则主机命令的输出 hostname Bourne 和 Korn 等旧 shell 中的情况)。

我会编写一个方法来检索(取决于操作系统)那些操作系统变量,并且仅作为最后的手段使用InetAddress.getLocalHost().getHostName() 方法。但这只是我。

更新(Unices)

正如其他人指出的那样,HOSTNAME 环境变量通常不适用于 Unix/Linux 上的 Java 应用程序,因为它默认不会导出。因此,除非您控制客户,否则这不是一种可靠的方法。这真的很糟糕。为什么没有包含此信息的标准属性?

唉,据我所知,在 Unix/Linux 上唯一可靠的方法是对 gethostname() 进行 JNI 调用或使用 Runtime.exec() 来捕获 hostname 命令的输出。我不是特别喜欢这些想法中的任何一个,但如果有人有更好的想法,我会全力以赴。 (更新:我最近遇到了gethostname4j,这似乎是我祈祷的答案)。

长读

我在another answer on another post 中创建了一个很长的解释。特别是您可能想阅读它,因为它试图建立一些术语,给出InetAddress.getLocalHost().getHostName() 解决方案何时失败的具体示例,并指出我目前知道的唯一安全解决方案,即gethostname4j

很遗憾,Java 没有提供获取计算机名的方法。如果可以的话,投票给JDK-8169296

【讨论】:

  • 我喜欢 gethostname4j 解决方案!我尝试按照其他人的建议编辑 /etc/hosts 文件。不知道为什么,但它并没有为我解决问题。 gethostname4j 返回的名称与我从 Inet 获得的名称相同,但速度更快,尤其是在 mac 上。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2010-10-02
相关资源
最近更新 更多