我想从我的 java 小程序中确定本地 IP 地址。问题是当同一台机器上有多个 IP 地址时,它具有 LAN 和 Internet 连接 (掌上电脑、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 :
你的 Crystal 球说的是实话。你已经明白我的问题了。客户端可以通过代理连接所以我不能使用你的第一点。如果我在我的计算机上执行以下代码:
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 地址的网络接口(interface),要猜测您认为哪个是“正确的”有点困难,因为它们实际上都是正确的。
我的 Crystal 球提示我您指的是 IP 地址,客户端使用该地址连接到服务器,小程序是从该服务器加载的。如果是这样,您至少有两种可能性:
在服务器上,您可以将小程序嵌入到动态生成的 HTML 页面中,并将客户端的 IP 地址添加为小程序参数。至少如果您不通过代理执行 HTTP,Web 服务器应该能够确定客户端的 IP 地址并将其传递给小程序。
在小程序中,您可以打开一个 TCP 套接字到您从中加载小程序的 Web 服务器,并检查正在使用哪个本地地址进行连接:
.
Socket s = new Socket("www", 80);
InetAddress ip = s.getLocalAddress();
s.close();
关于java - 从java小程序获取正确的本地IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1510526/