【问题标题】:Get the correct local IP address from java applet从 java applet 获取正确的本地 IP 地址
【发布时间】:2009-10-02 16:15:08
【问题描述】:

我想从我的 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

你的水晶球说的是真话。你已经明白我的问题了。客户端可以通过代理连接,所以我不能使用你的第一点。如果我在我的计算机上执行以下代码:

    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

【问题讨论】:

  • 你是说小程序吗?有一个主要的并且能够访问本地UP地址?
  • 我们也遇到过这个问题。
  • 你到底想做什么?为什么需要这些信息?如果用户没有本地地址怎么办?如果用户有很多接口和很多本地地址怎么办?如果用户有 IPv6(每个接口可能有很多地址)怎么办?你的程序有一些设计问题,它不应该依赖这个特性来正常工作。
  • 同样的问题,谢谢你的帖子;)

标签: java networking applet


【解决方案1】:

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

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

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

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

.

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

【讨论】:

【解决方案2】:

在 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 弗雷德桌面

你的代码返回

主机名 = 弗雷德桌面 主机地址本地 = 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 弗雷德桌面

您的代码将返回

主机名 = 弗雷德桌面 主机地址本地 = 127.0.1.1 主机地址 = 127.0.1.1 主机地址 = 192.168.1.1 主机地址 = 20.20.20.20

fred-desktop - 我的 ubuntu 机器的名称。

【讨论】:

  • 这不是问题所在。问题不在于名称解析,而是可能存在多个接口这一事实。
  • 问题是针对 Java 的,而您出于不同目的进行 C 调用
  • @mark - 你完全不明白我在说什么...... InetAddress.getAllByName(hostName) - 通过名称解析返回主机的 IP,而不是通过该主机的 PHISICAL 接口。获取本地机器接口的方法不正确
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
相关资源
最近更新 更多