【问题标题】:How to get computer's WAN IP address in Java?如何在 Java 中获取计算机的 WAN IP 地址?
【发布时间】:2010-10-07 13:58:50
【问题描述】:

如何使用 Java 获得计算机的广域网? 我试试这个:

ServerSocket ss = new ServerSocket(port);
System.out.println(ss.getInetAddress().getHostAddress());
//wich return 0.0.0.0

然后我试试这个:

System.out.println(InetAddress.getLocalHost().toString());
//which return keenan-a658368c/192.168.1.100 < yes it is connected to router

如函数所说,它返回我的本地 IP 地址

如何获取 WAN IP 地址?比如118.137.43.219

【问题讨论】:

  • 好吧,如果您连接到路由器,则您的计算机没有 WAN IP 地址。您可以向whatismyip.com/automation/n09230945.asp 发出 HTTP 请求,它将返回分配给您的 Internet 连接(调制解调器)的 IP 地址。
  • 哦,我明白了,所以我只能依靠外部服务器知道我的 IP。我可以使用我自己的 WebServer 中的 PHP 脚本(或 ASP)(我有一个 apache Web 服务器正在运行)或另一个 java 程序吗?
  • 是的,你可以:echo $_SERVER['REMOTE_ADDR'];

标签: java sockets ip-address wan


【解决方案1】:

您可以从http://whatismyip.com/automation/n09230945.asp 获得它。您可以打开到该站点的 HttpURLConnection 并解析输出。

这个程序应该会有所帮助:

import java.net.HttpURLConnection;

public class GetExternalIp {

    public static void main(String args[]) {
        try {

            java.net.URL url = new java.net.URL(
                    "http://whatismyip.com/automation/n09230945.asp");

            java.net.HttpURLConnection con = (HttpURLConnection) url
                    .openConnection();

            java.io.InputStream stream = con.getInputStream();

            java.io.InputStreamReader reader = new java.io.InputStreamReader(
                    stream);

            java.io.BufferedReader bReader = new java.io.BufferedReader(reader);

            System.out.print("Your IP address is " + bReader.readLine());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

引用自:

http://www.daniweb.com/forums/thread192872.html

http://www.coderanch.com/t/411356/java/java/Public-IP-Address-time-limit

【讨论】:

    【解决方案2】:

    如果您最终使用的远程服务会回复您的“外部 IP 地址”(请参阅​​其他答案以了解它可能是什么),请不要使用免费的无名地址之一。部署你自己的。您不得构建依赖于某人的 Acme Whats-My-IP 3000 的应用程序,该应用程序可能会在不通知您或任何其他不幸用户的情况下随时消失。

    【讨论】:

    • 好吧,那我会租一个免费的虚拟主机,然后放置 php 脚本:D
    • 免费托管服务与上面提到的无名外部托管 PHP 脚本一样糟糕。我的观点是,不要开发任何依赖资源的关键业务流程,这些资源可能会在没有通知的情况下消失。
    【解决方案3】:

    如 cmets 所述,如果您在执行 NAT 的路由器后面,您的机器将不知道其 WAN 地址。

    更复杂的情况是您位于 NAT 池后面。如果这是真的,那么您的 WAN 地址可能会定期更改,可能一天一次或更频繁。

    或者某些类型的流量可能会强制通过代理。这可能会使出站 HTTP 请求来自与 SSH 或其他任意协议不同的 WAN 地址。

    【讨论】:

      【解决方案4】:

      获取计算机主接口的IP地址:

      InetAddress.getLocalHost().getHostAddress()
      

      获取所有接口的IP地址:

      List<InetAddress> addresses = new LinkedList<InetAddress>();
      Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces();
      while (ifcs.hasMoreElements()) {
          NetworkInterface ifc = ifcs.nextElement();
          for (InterfaceAddress ifcAddr : ifc.getInterfaceAddresses()) {
              addresses.add(ifcAddr.getAddress());
          }
      }
      

      要获取 Internet 上的其他计算机会看到来自您计算机的连接的 IP 地址,请使用 YoK 的答案。

      【讨论】:

        【解决方案5】:

        一般而言,任何依赖于这样做的代码都存在设计错误 - 您能否详细说明为什么需要获取其 NAT 路由器的出口 IP 地址?

        出口 IP 地址根本无法帮助您创建回连接,因为路由器通常不会将其转发到适当的内部主机。

        【讨论】:

        • 它只是给用户的,所以它看起来像:在端口 5555 上的 xxx.xx.xxx.xxx 上创建服务器,然后你现在可以访问这个服务器(或 ServerSocket 对象)在那个ip上
        猜你喜欢
        • 2010-09-12
        • 2010-09-15
        • 2019-04-26
        • 2011-06-14
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 2012-09-01
        • 2011-11-04
        相关资源
        最近更新 更多