如何通过Java获取Linux上计算机的IP?
我在网上搜索了一些例子,我发现了一些关于 NetworkInterface 类的东西,但我无法理解如何获得 IP 地址。
如果我同时运行多个网络接口会怎样?将返回哪个 IP 地址。
我真的很感激一些代码示例。
PS:到目前为止,我一直使用 InetAddress 类,这对于跨平台应用程序来说是一个糟糕的解决方案。(赢/Linux)。
如何通过Java获取Linux上计算机的IP?
我在网上搜索了一些例子,我发现了一些关于 NetworkInterface 类的东西,但我无法理解如何获得 IP 地址。
如果我同时运行多个网络接口会怎样?将返回哪个 IP 地址。
我真的很感激一些代码示例。
PS:到目前为止,我一直使用 InetAddress 类,这对于跨平台应用程序来说是一个糟糕的解决方案。(赢/Linux)。
不要忘记环回地址,它们在外面是不可见的。这是一个提取第一个非环回 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()
. 为此,我必须专门打开 Socket,但是对于我的 Ubuntu 10.04 机器上的所有网络接口,这是获取外部 IP 地址的唯一方法。