【问题标题】:converting an IP address to host name将 IP 地址转换为主机名
【发布时间】:2025-11-29 14:50:02
【问题描述】:

在我的 java 应用程序中,如果用户输入 IP,我们需要显示主机名,如果给定主机名,那么我们需要显示主机的 IP。

例如,如果用户输入像173.194.36.37 这样的IP 地址,应用程序应该显示google.com,反之亦然。

是否有任何实用程序可用于执行此操作?

【问题讨论】:

  • 您知道一个 IP 号码可能有多个主机名吗?例如 127.0.0.1 有 both localhost 和 localhost.localdomain
  • @vidstige 不使用反向 DNS。这里的 IP 正好映射到一个主机名,即所谓的“规范主机名”。
  • 您无法获得唯一结果,请参阅 aruljohn.com/ip2hostname.html 173.194.36.37 请参阅 bom04s02-in-f5.1e100.net 而不是 google.com!
  • 173.194.36.37 不会解析为 google.com,而是解析为 bom04s02-in-f5.1e100.net。不过,IP 块归 Google 所有。
  • @SjB 你得到bom04s02-in-f5.1e100.net,对。仅此而已。当然,多个名称可以指向一个 IP 地址。但是一个 IP 地址只能反向解析为一个主机名。

标签: java network-programming


【解决方案1】:

就域名而言,没有内置实用程序,没有。您可以通过在InetAddress 上使用getCanonicalHostName() 来获取主机的名称(但不是域名) - 这应该可以。此处的最佳答案链接到DNS Java 项目,该项目将为您提供域名。

下面给出了连接到 Google 的一台服务器并从中获取主机名的示例代码:

public class GetHostName {
public static void main(String[] args) throws Exception {
    InetAddress address = InetAddress.getByAddress(new byte[]{74, 125,(byte) 227, 7});
    System.out.println(address.getCanonicalHostName());
}
}

【讨论】:

    【解决方案2】:

    SomeKittens 提到的项目看起来像一个用 Java 编写的完整 DNS 服务器,这可能超出了您的需要。看看java.net.InetAddress

    java.net.InetAddress.getByName("example.com").getHostAddress();
    

    【讨论】:

    • 对于 Google.com,此代码的结果是“74.125.237.100”。
    • 这是正确的,对吧?如果我转到74.125.237.100,我最终会访问 google.com。
    • 没有。 OP 要求提供给您 IP 地址的域名。上面的代码给出了完全相反的结果——一个给定域名的 IP 地址。
    • 他要求“反之亦然”……但如果您希望我的代码片段为您提供 IP 名称,那么您为什么首先通过 google.com?跨度>
    【解决方案3】:

    如果您使用 Java 编码,请尝试使用 InetAddress

    InetAddress addr = InetAddress.getByName("173.194.36.37");
    String host = addr.getHostName();
    System.out.println(host);
    

    【讨论】:

    • 显然,不要忘记对 UnknownHostException 的异常处理。
    【解决方案4】:

    您要查找的是名为DNS 的内容。 This project 似乎就是你要找的东西。

    【讨论】:

    • InetAddress.getHostName()的就不用引入第三方库了。
    • @PhilippReichart 问题是“有没有可用的实用程序”,所以我想为什么不开源第三方库。
    • @PrakashK 简单。当你想要的一切都可以通过调用现有方法来实现时,为什么要引入 100 多个 类?更少的活动部件,更少的出错。
    • @PhilippReichart InetAddress 类只会为您获取服务器的主机名,它不会为您获取域,这是 OP 所要求的(尽管他的措辞不太好)。
    • @Jon 你知道裸域只是一个substring() 距离任何主机名吗?这几乎不需要图书馆。