您提供的Java方法 getLocalIpAddress() 的目的是获取本地网络接口的IP地址,但实际运行结果返回了IPv6地址 fe80::439:26ff:feb0:9108%p2p0,这表明该方法未能准确筛选出期望的IPv4地址。为了解决这个问题,您可以对现有代码进行以下调整:
检查地址类型:在判断非回环地址的基础上,增加对IPv4地址类型的检查,确保只返回IPv4地址。
if (!address.isLoopbackAddress() && address instanceof Inet4Address) {
ipv4 = address.getHostAddress();
return ipv4;
}
优化循环逻辑:一旦找到符合条件的IPv4地址,立即跳出内层和外层循环,避免后续无用的遍历。
for (NetworkInterface ni : nilist) {
List<InetAddress> ialist = Collections.list(ni.getInetAddresses());
for (InetAddress address : ialist) {
if (!address.isLoopbackAddress() && address instanceof Inet4Address) {
ipv4 = address.getHostAddress();
return ipv4;
}
}
}
经过上述调整后,getLocalIpAddress() 方法将只返回一个非回环的IPv4地址。如果系统没有可用的IPv4地址,方法将返回 null。以下是修改后的完整代码:
public String getLocalIpAddress() {
String ipv4;
List<NetworkInterface> nilist = null;
try {
nilist = Collections.list(NetworkInterface.getNetworkInterfaces());
} catch (SocketException e) {
e.printStackTrace();
}
for (NetworkInterface ni : nilist) {
List<InetAddress> ialist = Collections.list(ni.getInetAddresses());
for (InetAddress address : ialist) {
if (!address.isLoopbackAddress() && address instanceof Inet4Address) {
ipv4 = address.getHostAddress();
return ipv4;
}
}
}
return null;
}
请注意,此方法可能返回 null,表示在当前设备上未找到有效的非回环IPv4地址。在调用该方法的代码中,应适当处理这种情况,如提示用户或采用备用策略。