Java:在不使用 Web 服务的情况下以编程方式获取外部 IP 地址

Java: Getting one's external IP address programmatically without using web services

我想找出我的外部 IP 地址。

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

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

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

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

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

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

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