如何通过Java获得Linux上的计算机的IP?

如何通过Java获得Linux上的计算机的IP?

我search了networking的例子,我发现一些关于NetworkInterface类,但我不能包裹我的头如何获得IP地址。

如果我有多个networking接口在同一时间运行会发生什么? 哪个IP地址将被返回。

我真的很感激一些代码示例。

PS:我到目前为止已经使用了InetAddress类,这是跨平台应用程序的一个糟糕的解决scheme。 (WIN / Linux的)。

Solutions Collecting From Web of "如何通过Java获得Linux上的计算机的IP?"

不要忘记在外面看不到的环回地址。 这是一个提取第一个非回送IP(IPv4或IPv6)

private static InetAddress getFirstNonLoopbackAddress(boolean preferIpv4, boolean preferIPv6) throws SocketException { Enumeration en = NetworkInterface.getNetworkInterfaces(); while (en.hasMoreElements()) { NetworkInterface i = (NetworkInterface) en.nextElement(); for (Enumeration en2 = i.getInetAddresses(); en2.hasMoreElements();) { InetAddress addr = (InetAddress) en2.nextElement(); if (!addr.isLoopbackAddress()) { if (addr instanceof Inet4Address) { if (preferIPv6) { continue; } return addr; } if (addr instanceof Inet6Address) { if (preferIpv4) { continue; } return addr; } } } } return null; } 

从Java教程

为什么InetAddress不是一个好的解决方案? 我没有看到有关跨平台兼容性的文档中的任何内容?

此代码将枚举所有网络接口并检索其信息。

 import java.io.*; import java.net.*; import java.util.*; import static java.lang.System.out; public class ListNets { public static void main(String args[]) throws SocketException { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) displayInterfaceInformation(netint); } static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { out.printf("Display name: %s\n", netint.getDisplayName()); out.printf("Name: %s\n", netint.getName()); Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { out.printf("InetAddress: %s\n", inetAddress); } out.printf("\n"); } } 

以下是示例程序的示例输出:

 Display name: bge0 Name: bge0 InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2 InetAddress: /121.153.225.59 Display name: lo0 Name: lo0 InetAddress: /0:0:0:0:0:0:0:1%1 InetAddress: /127.0.0.1 

这个代码工作4me:

 import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; public class ShowIp { public static void main(String[] args) throws SocketException { 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()); } } } } 

只是返回第一个非回送界面,这可能是由像Parallels这样的软件创建的。 尝试为eth0钓鱼是一个更好的选择。

 static private InetAddress getIPv4InetAddress() throws SocketException, UnknownHostException { String os = System.getProperty("os.name").toLowerCase(); if(os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0) { NetworkInterface ni = NetworkInterface.getByName("eth0"); Enumeration<InetAddress> ias = ni.getInetAddresses(); InetAddress iaddress; do { iaddress = ias.nextElement(); } while(!(iaddress instanceof Inet4Address)); return iaddress; } return InetAddress.getLocalHost(); // for Windows and OS X it should work well } 

在我的例子中最简单的解决方案是Socket.getLocalAddress() 。 我不得不打开专门为此目的的套接字,但与我的Ubuntu 10.04机器上的所有NetworkInterfaces这是获得外部IP地址的唯一方法。