Java:如何获取可以到达远程IP的本地接口(interface)的IP?

标签 java ip-address lookup

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

我自然而然地想象将所有地址都转换为整数并使用它们的网络掩码压缩本地 ips 并寻找“最佳匹配”,但我想知道是否有更好的方法?

(这是一个企业 (tm) 解决方案,所以切断服务提供商不是一种选择,至少在没有政治运动的情况下不是这样;))

最佳答案

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

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

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

关于Java:如何获取可以到达远程IP的本地接口(interface)的IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2995290/

相关文章:

java - 将 Axis2 WSDL 生成委托(delegate)给 JAX-WS RI?

c# - 套接字的远程地址为 0.0.0.0 且其状态为 Bound 意味着什么

ios - 如何获取打开的球形摄像头设备的IP地址并检查是否已连接?

mongodb - 在 mongodb 中使用选定字段和 where 子句连接两个表

java - 遍历 JTabbedPane 中的选项卡组件

java - 使用 Java 检测串行 COM 端口

JavaScript:如何获取用户IP地址?

excel - 仅当它们与查找中的类别 ID 匹配时,如何在 excel 中对值求和

php - 如何在 PHP 中检查域名服务器?

java - html5 : Write content to a page without refreshing