解决Java 获取 getHostAddress 为什么 是 127.0.0.1的具体操作步骤

解决Java 获取 getHostAddress 为什么 是 127.0.0.1的具体操作步骤

 https://blog.51cto.com/u_16175446/6683264

https://blog.51cto.com/u_16175435/6931367?u_atoken=553aa05b-e209-4bcd-9702-097eb2ba05e1&u_asession=01pOSf9Z9IgSM3-f-a0M-ue_1D4Df_cKc9YMOJ-yOopZf94XWnT4YMzxmv6jGgpylBYUZ1pt2ZuN-HWxunry_XnNsq8AL43dpOnCClYrgFm6o&u_asig=05e8UfzbqaZ0I2SYhoWmA474ORkb79xF6QD5nJgIQNTM-Q9n8GTU8lYrxXqYfe2AsUWLzXRfVz41d-iI0OFFC5hQqHxEHy3XlacDzXRAFFZ7ByNzmenXpfdofbQa1PcRI2ZtQNkgChw6VffUTdJi0d0GzudxD4QDWHx2Z4fOXyvJs7wipPKNwnIkC2LQES3y6-ksmHjM0JOodanL5-M1Qs1VHzqLrl2gozhD8FydSbnOjFqw4tPpVn-l-ctTXXaQd-0OcZ9_N_5ohvlFeApUdnFCYvtYvRpHOGYvs0KU7HN6PY94r_LXIIil3Y3aVPRGAe&u_aref=p5XOZN9lmZAkG2Mw%2FGR2HqUKlpg%3D

Java 获取 getHostAddress 为什么是 127.0.0.1
在Java中,我们可以使用InetAddress类的getHostAddress方法来获取本地主机的IP地址。然而,有时候我们会发现得到的IP地址是127.0.0.1,而不是我们期望的真实IP地址。那么为什么会出现这种情况呢?本文将深入讨论这个问题。

什么是 127.0.0.1
首先,我们需要了解127.0.0.1是什么意思。在IP协议中,127.0.0.1是一个保留的特殊IP地址,代表本地主机,也被称为"localhost"。当我们将IP地址设置为127.0.0.1时,我们实际上是在将流量路由回本地主机,而不是发送到网络上的其他主机。

获取本地IP地址的方法
让我们看一下如何使用Java获取本地IP地址:

import java.net.InetAddress;
import java.net.UnknownHostException;

public class GetLocalIPAddress {
public static void main(String[] args) {
try {
InetAddress localhost = InetAddress.getLocalHost();
String ipAddress = localhost.getHostAddress();
System.out.println("Local IP Address: " + ipAddress);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
运行上述代码,大多数情况下,你将看到输出结果为Local IP Address: 127.0.0.1。但这并不意味着你的计算机只有一个IP地址,而是因为默认情况下,Java使用localhost来解析主机名。

主机名解析
在Java中,当我们调用InetAddress.getLocalHost()时,它会尝试通过解析主机名来获取本地IP地址。主机名是一个用于标识网络上计算机的名称。在大多数情况下,主机名都被设置为localhost。

当我们调用InetAddress.getLocalHost()时,Java会首先检查/etc/hosts(在Unix/Linux系统中)或C:\Windows\System32\drivers\etc\hosts(在Windows系统中)文件,以查找主机名和IP地址的映射关系。如果在该文件中找到了映射关系,Java将返回相应的IP地址。否则,Java将尝试使用网络配置来解析主机名。

如果在/etc/hosts文件中只有一行记录,类似于127.0.0.1 localhost,那么Java将返回127.0.0.1作为本地IP地址。

解决方案
现在我们知道了为什么Java获取到的本地IP地址通常是127.0.0.1,那么如何获取真实的本地IP地址呢?

一种解决方案是使用NetworkInterface类来枚举所有的网络接口,并获取每个接口的IP地址。这样我们可以获取到所有的IP地址,而不仅仅是localhost。

import java.net.*;
import java.util.Enumeration;

public class GetLocalIPAddress {
public static void main(String[] args) {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if (!address.isLoopbackAddress() && address instanceof Inet4Address) {
System.out.println("Local IP Address: " + address.getHostAddress());
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
上述代码将返回所有非回环地址(即除了localhost外的IP地址)的列表。

结论
Java获取本地IP地址时返回127.0.0.1的原因是因为默认情况下主机名被设置为localhost,导致InetAddress.getLocalHost()方法返回127.0.0.1作为本地IP地址。

如果想获取真实的本地IP地址,需要使用NetworkInterface类来枚举所有的网络接口,并获取每个接口的IP地址。
-----------------------------------
©著作权归作者所有:来自51CTO博客作者mob649e81576de1的原创作品,请联系作者获取转载授权,否则将追究法律责任
解决Java 获取 getHostAddress 为什么 是 127.0.0.1的具体操作步骤
https://blog.51cto.com/u_16175446/6683264

posted @ 2023-09-27 22:05  txwtech  阅读(334)  评论(0编辑  收藏  举报