【问题标题】:Java: Getting one's external IP address programmatically without using web servicesJava:在不使用 Web 服务的情况下以编程方式获取外部 IP 地址
【发布时间】:2015-04-19 19:36:19
【问题描述】:

我想知道我的外部 IP 地址。

一个非常常见的解决方案是设置一个BufferedReader 指向网站http://checkip.amazonaws.com

有没有解决方案可以在不连接到外部网站的情况下执行此操作,或者换句话说,我如何以编程方式找到我的外部 IP 地址?

【问题讨论】:

标签: java network-programming ip-address


【解决方案1】:

答案有点复杂,因为这完全取决于您的计算机如何连接到互联网。如果计算机直接分配了一个可公开路由的 IP 地址,那么您只需列出分配给每个机器网络接口的网络地址。对于服务器,这种情况很典型。

但是,计算机也可以通过网络地址转换 (NAT) 层连接。在这种情况下,您的计算机不会直接分配一个可公开路由的 IP 地址;相反,它被赋予一个本地 IP 地址(例如 10.x.x.x 或 192.168.x.x),然后路由器(通常是下一跳)会将数据包从本地地址空间映射到公共地址空间。这些设置可能会有很大差异,因此建议只使用众所周知的外部服务(例如您提到的 checkip.amazonaws.com),因为无论中间地址转换如何,该方法都应该有效。

【讨论】:

  • 不知道为什么有人反对这个答案为-1,这是一个正确的解释。如果服务器经过 NAT,则无法找到真正的外部 IP。
【解决方案2】:

George P 所说的当然是正确的,您必须连接到外部路由器。实际上,为此目的定义了特定的 IETF 协议,例如 http://en.wikipedia.org/wiki/STUN RFC 5389。因此,我建议您使用标准化的方式来执行此操作,即使用公共 STUN 服务器。

例如,请看这里: http://babbly.googlecode.com/svn/trunk/src/org/babbly/core/net/InetAddresResolver.java

有关更多信息和公共 STUN 服务器列表,请查看此处: http://www.voip-info.org/wiki/view/STUN

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2015-02-16
    • 2014-08-31
    • 2011-10-19
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多