从Java applet获取正确的本地IP地址

我想从我的Java小程序中确定本地IP地址。 问题是当同一台机器上有多个IP地址时,它们有LAN和互联网连接(掌上电脑,VMWare ……)。

这是我的测试:

public static void main(String[] args) { try { String hostName = InetAddress.getLocalHost().getHostName(); System.out.println("HostName = " + hostName); System.out.println("HostAddressLocal = " + InetAddress.getLocalHost().getHostAddress()); InetAddress[] inetAddresses = InetAddress.getAllByName(hostName); for (InetAddress inetAddress : inetAddresses) { System.out.println("hostAddress = " + inetAddress.getHostAddress()); } } catch (Exception e) { e.printStackTrace(); } } 

结果是:

  HostName = xxxx HostAddressLocal = xx.xx.xx.xx hostAddress = 10.10.11.51 hostAddress = 192.168.23.1 hostAddress = 192.168.106.1 

其中xx.xx.xx.xx不是正确的地址。 正确的是10.10.11.51。


编辑以回应jarnbjo :

你的水晶球说实话。 你了解我的问题。 客户端可以通过代理连接,因此我无法使用您的第一点。 如果我在我的电脑上执行以下代码:

  Socket s = new Socket("www.w3c.org", 80); InetAddress ip = s.getLocalAddress(); System.out.println("Internet IP = " + ip.toString()); s.close(); 

我有这个结果:

  Internet IP = /127.0.0.1 

而不是10.10.11.51

正如您已经发现的那样,计算机可能有很多具有不同IP地址的网络接口,并且有点难以猜测您认为哪一个是“正确的”,因为它们实际上都是正确的。

我的水晶球告诉我你的意思是客户端用来连接服务器的IP地址,applet是从该地址加载的。 如果是这样,您至少有两种可能性:

  • 在服务器上,您可以将applet嵌入到动态生成的HTML页面中,并将客户端的IP地址添加为applet参数。 至少如果您没有通过代理进行HTTP,Web服务器应该能够确定客户端的IP地址并将其传递给applet。

  • 在applet中,您可以打开一个TCP套接字到您加载applet的Web服务器,并检查用于连接的本地地址:

 Socket s = new Socket("www", 80); InetAddress ip = s.getLocalAddress(); s.close(); 

在getHostName()的底部C函数gethostbyname()。 他们最初寻找/ etc / hosts,然后尝试通过DNS解析。 所以,如果你将10.10.11.51 myhostname添加到/ etc / hosts中,getHostName()应该正确检测到它在windows中有/ etc / hosts模拟,AFAIR在\ WINDOWS \ System32 \ Servises中……

这只是名称解析问题。

在您的代码中,您首先获得主机名(hostName = InetAddress.getLocalHost()。getHostName();)此函数返回安装系统时设置的计算机名称。 然后你得到具体主机名的所有IP(InetAddress.getAllByName(hostName)) – 这将返回为此主机名解析的所有IP

简单的例子

1 / etc / hosts就像这样

 127.0.0.1 localhost
 127.0.1.1 fred-desktop

你的代码返回

 HostName = fred-desktop
 HostAddressLocal = 127.0.1.1
 hostAddress = 127.0.1.1

2更改/ etc / hosts看起来像

 127.0.0.1 localhost
 127.0.1.1 fred-desktop
 192.168.1.1 fred-desktop
 20.20.20.20 fred-desktop

你的代码将返回

 HostName = fred-desktop
 HostAddressLocal = 127.0.1.1
 hostAddress = 127.0.1.1
 hostAddress = 192.168.1.1
 hostAddress = 20.20.20.20

fred-desktop – 我的ubuntu盒子的名字。