在不连接互联网的情况下获取本地IP地址
因此,我正在尝试获取本地网络中本机的IP地址(应该是192.168.178.41
)。
我的初衷是使用这样的东西:
InetAddress.getLocalHost().getHostAddress();
但它只会返回127.0.0.1
,这是正确的,但对我却没有太大帮助。
我四处搜索并找到了这个答案http://codingdict.com/questions/121424,它仅创建了Socket
到某些网页的-
connection(例如“ google.com”),并从套接字获取了本地主机地址:
Socket s = new Socket("google.com", 80);System.out.println(s.getLocalAddress().getHostAddress());
s.close();
这确实适用于我的机器(返回192.168.178.41
),但需要连接到互联网才能工作。由于我的应用程序不需要互联网连接,并且每次启动应用程序都尝试连接到Google时似乎“可疑”,所以我不喜欢使用它的想法。
因此,在进行了更多研究之后,我偶然发现了NetworkInterface
-class,它(也做了一些工作)也返回了所需的IP地址:
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
)的含义。
另外,我还没有找到一种方法来从返回的地址中过滤掉它(通过使用isXX()
-object的-
方法InetAddress
),然后再使用RegEx,我发现它很“脏”。
除了使用RegEx或互联网之外,还有其他想法吗?
回答:
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是未来的^^。
PS:检查您break
的某些s是否应该是continue
s。
以上是 在不连接互联网的情况下获取本地IP地址 的全部内容, 来源链接: utcz.com/qa/414564.html