我尝试使用 Java 查找我的 PC 的本地 IP 地址。然而,结果并不正确。具体来说,我需要通过 ipconfig 命令获取无线 LAN 适配器 WiFi IPv4 地址。我查看了许多不同的问题,例如 this excellent answer但目前还不清楚如何在 Java 中做到这一点。 InetAddress.getLocalHost()
返回错误的 IP(“以太网适配器 VirtualBox 仅主机网络”)。
我尝试了以下代码:
public static List<String> getLocalIPAddresses() throws Exception
{
val networkInterfaces = NetworkInterface.getNetworkInterfaces();
val localIPAddresses = new ArrayList<String>();
while (networkInterfaces.hasMoreElements())
{
for (val interfaceAddress : networkInterfaces.nextElement().getInterfaceAddresses())
{
val address = interfaceAddress.getAddress();
// Find the local IP addresses
if (address.isSiteLocalAddress())
{
val localIPAddress = interfaceAddress.getAddress().toString().replace("/", "");
localIPAddresses.add(localIPAddress);
}
}
}
if (localIPAddresses.isEmpty())
{
throw new IllegalStateException("Expected the computer's local IP address but didn't get one!");
}
return localIPAddresses;
}
注意:
val
来自Lombok
.
在我的机器上,这会返回 2 个 IP 地址的列表:
192.168.56.1
192.168.2.103
“以太网适配器 VirtualBox 仅主机网络”和正确的“无线 LAN 适配器 WiFi”。我可以做什么来始终保证后者?显然检查 isSiteLocalAddress()
(又名本地 IP 地址)是不够的。代码方面还可以做什么?过滤掉“VirtualBox”并不是一个万无一失的解决方案,特别是因为网络接口(interface)名称与语言相关:
public static List<String> getLocalIPAddresses() throws Exception
{
val networkInterfaces = NetworkInterface.getNetworkInterfaces();
val localIPAddresses = new ArrayList<String>();
while (networkInterfaces.hasMoreElements())
{
val networkInterface = networkInterfaces.nextElement();
val displayName = networkInterface.getDisplayName();
if (!displayName.contains("VirtualBox"))
{
for (val interfaceAddress : networkInterface.getInterfaceAddresses())
{
val address = interfaceAddress.getAddress();
// Find the local IP addresses
if (address.isSiteLocalAddress())
{
val localIPAddress = interfaceAddress.getAddress().toString().replace("/", "");
localIPAddresses.add(localIPAddress);
}
}
}
}
if (localIPAddresses.isEmpty())
{
throw new IllegalStateException("Expected the computer's local IP address but didn't get one!");
}
return localIPAddresses;
}
我需要一个独立于平台的解决方案。不过我用的是 Windows。
最佳答案
为什么不使用 isVirtual()
方法。
static List<String> getLocalIpAddress() throws SocketException {
Enumeration<NetworkInterface> networkInterfaces = null;
List<String> localIpAddress = new ArrayList<String>();
networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = networkInterfaces.nextElement();
System.out.println("=== <" + ni.getDisplayName() + "> ===");
if (!ni.isUp()) {
for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
System.out.println("not up : " + addr.getAddress().getHostAddress());
}
continue;
}
if (ni.isLoopback()) {
for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
System.out.println("loopback : " + addr.getAddress().getHostAddress());
}
continue;
}
if (ni.isVirtual()) {
for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
System.out.println("virtual : " + addr.getAddress().getHostAddress());
}
continue;
}
if (!ni.isPointToPoint()) {
for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
System.out.println("not ppp : " + addr.getAddress().getHostAddress());
}
continue;
}
for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
InetAddress address = addr.getAddress();
if (address.isLinkLocalAddress()) {
System.out.println("link local address: " + address.getHostName() + address.getHostAddress());
continue;
}
if (address.isSiteLocalAddress()) {
System.out.println("site local address: " + address.getHostName() + address.getHostAddress());
continue;
}
System.out.println("getHostName: " + address.getHostName());
System.out.println("getHostAddress : " + address.getHostAddress());
System.out.println("------separator-------");
localIpAddress.add(address.getHostAddress());
}
}
return localIpAddress;
}
关于java - 查找本地机器 IP 地址,无误报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607881/