Java:如何获得可以访问远程IP的本地接口的IP?

时间:2010-06-08 06:53:31

标签: java ip-address lookup

我有一个Java应用程序,它在服务提供程序中注册服务器组件,然后将服务名称发送到客户端。客户端使用服务名称从服务提供者处获取服务器的地址。但是,服务器有几个接口,其中只有1个客户端可以访问,因此必须使用正确的IP注册该服务。我们通过广播发现了客户端,所以我有客户端IP和计算机网络接口的枚举。如何将IP与接口匹配,而不知道客户端IP的网络掩码是什么?

我会想象将所有地址转换为整数并用网络掩码扼杀当地的ips并寻找“最佳匹配”,但我想知道是否有更好的方法?

(这是一个企业(tm)解决方案,因此切断服务提供商不是一种选择,至少不首先是政治活动;)

4 个答案:

答案 0 :(得分:2)

据我了解,服务提供商在多个不同的网络上有接口。每个客户端仅在这些网络中的一个上,因此只能与其中一个接口通信。该服务需要发现客户端可以访问哪些接口,以便它可以发送正确的地址。您(服务开发人员)无法控制部署该服务的网络环境,因此无法使用DNS等网络级解决方案。

在许多网络设置中,路由是对称的。也就是说,从主机A到主机B的路由与从主机B到主机A的路由相同。如果您知道在您的服务将部署到的所有环境中都是这种情况,那么您可以放心地假设使用的地址客户端可以访问连接到客户端。例如,可以通过将DatagramSocket连接到客户端然后调用其getLocalAddress()方法来发现该地址。

如果路由是非对称的,我知道无法确定客户端是否只使用java.net API访问特定接口。如果您控制客户端实现,您可以在其广播响应数据包中包含广播源地址(应该是可见的服务器接口)。除此之外,您尚未提供有关该方案的足够信息以提供具体建议。例如,知道什么协议用于广播广告和客户端响应将是有用的。

答案 1 :(得分:0)

这取决于你如何处理这个问题。

示例代码多吗?

InetAddress有一个“.getHostAddress()”方法可能很有用。

答案 2 :(得分:0)

这通常使用DNS完成。该接口应列在DNS中,以便您可以通过名称访问它,而不是通过servicehost.example.com而不是192.0.2.42。

答案 3 :(得分:0)

它比应用程序更像是一个网络管理问题。

考虑服务器(托管java应用程序)是多宿主的。 它可以是三个地址: 1.99.88.77.66(公共知识产权) 2. 10.10.10.10(私人,内部分配的IP)

您的潜在客户可以访问哪个IP取决于网络配置。

客户端可以从公共IP访问,但由于NAT,它将访问您的私有IP。 另一个例子,可能是你的客户端IP是192.168.10.10,通过NAT,它访问你的10.10.10.10 IP。

您无法通过任何类型的前缀匹配计算正确的IP(发布您的服务)。

您已经提到过,它是一种企业解决方案,复杂的网络配置在这种环境中很常见。

使用DNS,您的服务器主机可能是myapp.company.com 由DNS工具决定客户端的正确IP。 您可能需要与网络人员协调,并在DNS中提供适当的支持, 解决方案应该是微不足道的,更加健壮。