无需连接到互联网即可获取本地 IP 地址

2022-09-01 07:37:55

因此,我正在尝试在我的本地网络中获取计算机的IP地址(应该是)。192.168.178.41

我的第一个意图是使用这样的东西:

InetAddress.getLocalHost().getHostAddress();

但它只返回,这是正确的,但对我来说不是很有帮助。127.0.0.1

我搜索了一下,https://stackoverflow.com/a/2381398/717341 找到了这个答案,它只是创建一个与某个网页的-连接(例如“google.com”),并从套接字中获取本地主机地址:Socket

Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();

这确实适用于我的机器(它会返回),但它需要连接到互联网才能工作。由于我的应用程序不需要互联网连接,并且该应用程序每次启动时都会尝试连接到Google,因此我不喜欢使用它的想法。192.168.178.41

因此,经过更多的研究,我偶然发现了-类,它(经过一些工作)也确实返回了所需的IP地址:NetworkInterface

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
    NetworkInterface current = interfaces.nextElement();
    System.out.println(current);
    if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
    Enumeration<InetAddress> addresses = current.getInetAddresses();
    while (addresses.hasMoreElements()){
        InetAddress current_addr = addresses.nextElement();
        if (current_addr.isLoopbackAddress()) continue;
        System.out.println(current_addr.getHostAddress());
    }
}

在我的计算机上,这将返回以下内容:

name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)

它找到我的网络接口并返回所需的IP,但我不确定另一个地址()是什么意思。fe80:0:0:0:226:4aff:fe0d:592e%3

另外,我还没有找到一种方法从返回的地址(通过使用-object的-方法)中过滤它,然后使用RegEx,我发现它非常“肮脏”。isXX()InetAddress

除了使用正则表达式或互联网之外,还有其他想法吗?


答案 1

fe80:0:0:0:226:4aff:fe0d:592e 是您的 ipv6 地址 ;-)。

使用

if (current_addr instanceof Inet4Address)
  System.out.println(current_addr.getHostAddress());
else if (current_addr instanceof Inet6Address)
  System.out.println(current_addr.getHostAddress());

如果您只关心IPv4,那么只需丢弃IPv6案例即可。但要注意,IPv6是未来^^。

P.S.:检查你的一些s是否应该是s。breakcontinue


答案 2

这里也是java 8的一种方式:

public static String getIp() throws SocketException {

    return Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
            .flatMap(i -> Collections.list(i.getInetAddresses()).stream())
            .filter(ip -> ip instanceof Inet4Address && ip.isSiteLocalAddress())
            .findFirst().orElseThrow(RuntimeException::new)
            .getHostAddress();
}