java InetAddress.getLocalHost();返回 127.0.0.1 ...如何获得真正的IP?
2022-08-31 17:34:26
我正在编写一个简单的网络应用程序。我需要知道网络上我的机器的真实IP,例如192.168.1.3 。getLocalHost返回127.0.0.1(在Linux上,我不知道它在Windows上是否相同)。怎么办?
我正在编写一个简单的网络应用程序。我需要知道网络上我的机器的真实IP,例如192.168.1.3 。getLocalHost返回127.0.0.1(在Linux上,我不知道它在Windows上是否相同)。怎么办?
如果您实际上想要使用计算机上的所有 IP 地址,则可以使用 NetworkInterface 类获取这些地址。当然,然后你需要你真正想要使用哪一个,但这会有所不同,这取决于你使用它的目的,或者你可能需要扩展你使用它的方式来解释多个地址。
import java.net.*;
import java.util.*;
public class ShowInterfaces
{
public static void main(String[] args) throws Exception
{
System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress()); // often returns "127.0.0.1"
Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
for (; n.hasMoreElements();)
{
NetworkInterface e = n.nextElement();
System.out.println("Interface: " + e.getName());
Enumeration<InetAddress> a = e.getInetAddresses();
for (; a.hasMoreElements();)
{
InetAddress addr = a.nextElement();
System.out.println(" " + addr.getHostAddress());
}
}
}
}
由于计算机可能有多个地址,因此很难确定哪一个地址适合您。通常,您希望系统根据其路由表分配 IP。由于结果取决于您要连接到的IP,因此有一个简单的技巧:只需创建一个连接,然后查看您从操作系统获得的地址:
// output on my machine: "192.168.1.102"
Socket s = new Socket("192.168.1.1", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
// output on my machine: "127.0.1.1"
System.out.println(InetAddress.getLocalHost().getHostAddress());
我不确定是否有可能在不建立连接的情况下执行此操作。我想我曾经用Perl(或C?)做到这一点,但不要问我关于Java的问题。我认为有可能在不实际连接的情况下创建一个UDP套接字(DatagramSocket)。
如果途中有NAT路由器,您将无法获得远程主机将看到的IP。但是,正如你以192.*为例,我认为你并不在乎。