EFa*_*lco 9 java networking applet
我想从我的java applet中确定本地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();
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
HostName = xxxx
HostAddressLocal = xx.xx.xx.xx
hostAddress = 10.10.11.51
hostAddress = 192.168.23.1
hostAddress = 192.168.106.1
Run Code Online (Sandbox Code Playgroud)
其中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();
Run Code Online (Sandbox Code Playgroud)
我有这个结果:
Internet IP = /127.0.0.1
Run Code Online (Sandbox Code Playgroud)
而不是10.10.11.51
jar*_*bjo 11
正如您已经发现的那样,计算机可能有很多具有不同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();
Run Code Online (Sandbox Code Playgroud)
Ale*_*dov -1
在 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 本地主机 127.0.1.1 弗雷德桌面
你的代码返回
主机名 = fred-desktop 本地主机地址 = 127.0.1.1 主机地址 = 127.0.1.1
2 将 /etc/hosts 更改为如下所示
127.0.0.1 本地主机 127.0.1.1 弗雷德桌面 192.168.1.1 弗雷德桌面 20.20.20.20 弗雷德桌面
你的代码将返回
主机名 = fred-desktop 本地主机地址 = 127.0.1.1 主机地址 = 127.0.1.1 主机地址 = 192.168.1.1 主机地址 = 20.20.20.20
fred-desktop - 我的 ubuntu 盒子的名称。
| 归档时间: |
|
| 查看次数: |
14944 次 |
| 最近记录: |