5

我正在使用下面的代码打印出使用 java 1.5 的 linux 机器的主机名

public static void main(String a[]) {
    System.out.println( InetAddress.getLocalHost().getCanonicalHostName() );
}

当我有系统的主机名一个 64 字符长度的字符串时,代码只会打印“localhost.localdomain”。如果我的主机名长度小于 64,它会正确打印出主机名。系统的最大主机名长度为 64(getconf HOST_NAME_MAX 为 64)

这里有什么问题?这可能是一个错误(不过,我倾向于认为问题在我这边)

感谢帮助!

4

2 回答 2

3

Linux 上可能发生的情况是InetAddress.getLocalHost()返回环回地址(在 127/8 中,通常为 127.0.0.1)。因此取自/etc/hosts文件的名称很可能是localhost.localdomain.

为了获得正确的地址/主机名,您可以改用以下代码,它将列出与网络接口关联的所有 IP 地址(eth0在我的示例中),我们将选择不属于的 IPv4环回类。

try {
    // Replace eth0 with your interface name
    NetworkInterface i = NetworkInterface.getByName("eth0");

    if (i != null) {

        Enumeration<InetAddress> iplist = i.getInetAddresses();

        InetAddress addr = null;

        while (iplist.hasMoreElements()) {
            InetAddress ad = iplist.nextElement();
            byte bs[] = ad.getAddress();
            if (bs.length == 4 && bs[0] != 127) {
                addr = ad;
                // You could also display the host name here, to 
                // see the whole list, and remove the break.
                break;
            }
        }

        if (addr != null) {
            System.out.println( addr.getCanonicalHostName() );
        }
    } catch (...) { ... }

您可以稍微更改代码以显示所有地址,请参阅代码中的注释。

编辑

正如@rafalmag 所建议的,您可能还想迭代其他网卡

而不是 NetworkInterface.getByName("eth0") 我建议迭代 NetworkInterface.getNetworkInterfaces()

于 2011-02-02T17:22:29.780 回答
0

很难猜测您的情况可能出了什么问题,但是根据Java 6 中的相应代码,它可能就像名称解析问题一样简单,或者可能是 Java 错误地认为您的 64 个字符的主机名被欺骗了。

于 2011-02-02T16:49:27.123 回答