我使用下面的代码使用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)
这里有什么问题?这可能是一个错误(但我倾向于认为问题在我身边)
感谢您的帮助!
答案 0 :(得分:3)
Linux上可能发生的是InetAddress.getLocalHost()
将返回环回地址(在127/8中,通常为127.0.0.1)。因此,/etc/hosts
文件中的名称可能是localhost.localdomain
。
为了获得正确的地址/主机名,您可以使用以下代码,它将列出与网络接口关联的所有IP地址(在我的示例中为eth0
),我们将选择IPv4 one,不属于loopback类。
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
的建议迭代其他NIC而不是NetworkInterface.getByName(“eth0”)我建议迭代一下NetworkInterface.getNetworkInterfaces()
答案 1 :(得分:0)
很难猜出你的情况可能会出现什么问题,但基于corresponding code from Java 6,它可能就像名称解析问题一样简单,或者可能是Java错误地认为你的64个字符的主机名是欺骗性的。