我需要使用Java从Ubuntu获取计算机IP。我尝试使用InetAddress.getLocalHost.getHostAddress().toString();
,但它返回127.0.0.1
。我正在寻找解决方案并找到了这段代码:
NetworkInterface ni = NetworkInterface.getByName("eth0");
Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
while(inetAddresses.hasMoreElements()) {
InetAddress ia = inetAddresses.nextElement();
if(!ia.isLinkLocalAddress()) {
System.out.println("IP: " + ia.getHostAddress());
}
}
}
此代码对我有用,但问题是当计算机使用“eth1”接口或计算机可以使用无线适配器连接到网络(wlan0)。在那个情况下,程序将失败。你能用安全的方法告诉我从UNIX系统获取IP吗?问候。
答案 0 :(得分:1)
使用枚举getNetworkInterfaces();
并循环显示它们。
Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
while (eni.hasMoreElements()) {
NetworkInterface ni = eni.nextElement();
Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
while(inetAddresses.hasMoreElements()) {
InetAddress ia = inetAddresses.nextElement();
if(!ia.isLinkLocalAddress()) {
System.out.println("Interface: " + ni.getName() + " IP: " + ia.getHostAddress());
}
}
}
在我的linux机器上,isLinkLocalAddress()似乎无法正常工作,因为我得到了127.0.0.1但是这个和ipv6版本很容易手动过滤掉。
Interface: wlan0 IP: 192.168.0.8
Interface: lo IP: 0:0:0:0:0:0:0:1%1
Interface: lo IP: 127.0.0.1
我的机器仅在192.168.0.8的无线接口上连接
答案 1 :(得分:1)
虽然计算机可以有多个网络接口和不同的IP,但某些接口也可以是环回或不运行。为了“安全”,你甚至可能需要检查界面的名称,看看你是否使用了所需的IP地址。
以下方法将为您提供非环回,启动和运行接口的IP地址列表。
public static List<InetAddress> getIPAddress() throws SocketException {
List<InetAddress> ipAddresses = new ArrayList<InetAddress>();
Enumeration e;
e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) e.nextElement();
if (ni.isLoopback() || !ni.isUp()) continue;
for (Enumeration e2 = ni.getInetAddresses(); e2.hasMoreElements(); ) {
InetAddress ip = (InetAddress) e2.nextElement();
ipAddresses.add(ip);
}
}
return ipAddresses;
}
答案 2 :(得分:0)