2010-06-08 59 views
4

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

自发地我想象把所有的地址都整合起来,用他们的网络掩码捣毁本地ips并寻找'最佳匹配',但我想知道是否有更好的方法?

(这是一个企业(TM)解决方案,使切割出的服务提供商是不是一种选择,至少不会瓦特/ OA政治运动第一;))

回答

2

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

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

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

+0

底层操作系统应该照顾大多数低级套接字的东西。只需创建套接字并调用get本地地址方法即可。作为最后的手段,通过枚举本地地址,您可以创建套接字,将它们绑定到套接字上,然后查看是否可以连接到您的客户端。但'Socket(clientIP,port).getLocalAddress()'应该可以工作。 – Allen 2010-06-29 17:51:42

+0

只要网络上的路由是对称的,就应该可以工作。如果不是用于向客户端发送数据报的本地IP可能与客户端有权访问的IP不同。 – 2010-06-30 05:25:32

0

这取决于你如何去约这个。

样码很多?

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

+0

目前我只是抓住NetworkInterface.getNetworkInterfaces,通过他们所有,看看他们所有的inetAddresses(是的,用getHostAddress),然后匹配前3个八位字节。但正如我所说,我不能假设255.255.255.0位掩码(或任何其他),所以我正在寻找一个更强大的解决方案。对isReachable和getByAddress的组合排序会很好,但我在API中没有找到类似的东西。 – 2010-06-08 07:13:06

+0

“isReachable和getByAddress的组合排序本来不错,但我在API中没有找到类似的东西。” - 您已经拥有地址,InetAdress拥有一个方法isReachable(int timeout)(自1.5开始),但根据文档“如果可以获得特权,典型实现将使用ICMP ECHO REQUEST,否则它将尝试建立TCP连接目标主机的端口7(Echo)“,这样就需要在服务器上启用。 – 2010-06-08 11:46:53

0

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

+0

的确如此。我不确定是否在此环境中设置了任何DNS服务器,并且服务提供商现在只采用直接IP(并且由另一个国家的部门拥有)。但如果我可以使用DNS,我仍然需要为每个地址注册一个单独的名称吗?我需要知道哪个名字可以从给定的IP访问,而且我会处于或多或少相同的情况。或者DNS服务器处理这本质? – 2010-06-08 07:38:06

0

这是一个比应用程序更多的网络管理问题。

考虑服务器(托管Java应用程序)是多宿主的。 也可以是三个地址: 1. 99.88.77.66(公网IP) 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中提供适当的支持, 该解决方案应该是微不足道的,并且更加健壮。

相关问题