我正在写一个简单的网络应用程序…我需要知道我的机器在网络上的真实IP,例如192.168.1.3。getLocalHost返回127.0.0.1(在Linux上,如果在Windows上相同,则为dunno)怎么做?
由于机器可能有多个地址,因此很难确定哪个地址适合您。通常,您希望系统根据其路由表分配IP。由于结果取决于您要连接的IP,因此有一个简单的技巧:只需创建一个连接并查看您从OS获得的地址:
// 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. *为例,我认为您不在乎。
如果您实际上要使用计算机上的所有IP地址,则可以使用NetworkInterface类获得这些IP地址。当然,那么您需要实际使用哪个地址,但这取决于您使用它的目的,或者您可能需要扩展使用它的方式来考虑多个地址。
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()); } } } }