java - 从java小程序获取正确的本地IP地址

标签 java networking applet

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

相关文章:

java - 小程序参数不保留 CRLF

java - 有人可以解释一下下面与java中StringBuffer相关的代码吗?

java - 未捕获自定义 RuntimeException

linux - 使用 IP 队列时出现 Netlink 错误

networking - 禁用docker容器中的hosts文件

linux - 结合sento()写writev()?

java - 运行签名小程序时出现"Class No Found"错误

java - 小程序性能: loading all jars at startup or only when class is needed?

java - 应用程序上下文中用于可缓存注释的类 bean

java - XPath 使用空节点