获取网络上可用的计算机的IP地址? -java

我正在制作一个文件共享应用程序,它将查找在同一网络上运行该应用程序的计算机。 所以我希望我的应用程序能够发现计算机及其IP地址。 使用Java可以实现此任务吗?

谢谢

这是分布式计算的基本问题之一,在某种程度上有两种方法可行:

注册服务

  • 在网络的某个位置,您使用众所周知的主机和端口号运行Registry Service。 必须可以从要运行应用程序的每个位置访问/可寻址此服务。

  • 启动时,网络上的每个应用程序实例都会向注册表注册。

  • 当某个机器/程序需要找到应用程序的实例时,它会询问注册表。

问题:

  • 您必须在不告知注册表的情况下处理“消失”的应用程序实例。

  • 如果注册表重新启动,您必须有一种方法来恢复状态。

  • 应用程序必须知道注册表实例的名称(或地址)和端口。

广播/多播

  • 应用程序的每个实例都侦听一个众所周知的“广播”或“多播”地址/端口。

  • 当程序想要定位应用程序的实例时,它发送广播/多播请求。

  • 每个实例都会响应请求,并提供详细信息。

  • 程序累积响应以构建所有“实时”实例的列表。

问题:

  • 这不规模。 来自M个程序的每个请求都转到N台机器并生成N个响应。 随着M和N的增长,网络流量呈二次方式增长。

  • 广播和组播是有损耗的,尤其是在繁忙的网络上。

  • 广播通常不跨越网络边界。 组播需要特殊配置。


这两种方法都应该在具有有限数量实例的小型网络上运行。

简单的方法是确定现有的分布式计算技术,为您完成大部分工作。 例如,RMI和RMI注册表,动态DNS,CORBA,JINI。

我找到了这个问题的答案。我环顾四周,发现了这段代码。 它不是最好的方法,但它的工作原理..

import java.io.IOException; import java.net.InetAddress; public class networkPing { public static void main(String[] args) throws IOException { InetAddress localhost = InetAddress.getLocalHost(); // this code assumes IPv4 is used byte[] ip = localhost.getAddress(); for (int i = 1; i <= 254; i++) { ip[3] = (byte)i; InetAddress address = InetAddress.getByAddress(ip); if (address.isReachable(1000)) { System.out.println(address + " machine is turned on and can be pinged"); } else if (!address.getHostAddress().equals(address.getHostName())) { System.out.println(address + " machine is known in a DNS lookup"); } } } } 

这里的一个问题是“同一网络”没有明确定义。 你的意思是一个子网? 所有节点都可以在路由器之前到达?

例如,如果你的意思是“局域网”,这在TCP中没有任何意义,但SAMBA可能会有所帮助。

如果可以让其他节点响应,可以通过使用适当的范围多播来解决其中一些问题。 或者,如果您知道子网掩码,则可以进行IP地址算法。 但是你需要首先更准确地定义你的问题。

你应该看看关于jxta的这篇文章 。 它是Sun的P2P Java框架,它被许多流行的应用程序所使用。 查看一些使用jxta的应用程序可能也不错,因为它们可能已经做了类似于您尝试做的事情。

使用多播DNS(我不知道如何在Java / Windows上使用它)。

或使用IP广播(使用UDP)。

每台计算机都应将DatagramPacket发送到多播组。 还接收来自组的数据包。 然后使用getAddress()从数据包中获取InetAddress对象。

请记住:要接收组播数据包,系统应加入组播组。 但任何人(无需加入)都可以将数据包发送到多播组。

示例在这里。

我发现Apache commons JCS(一个缓存库)的这个实用程序类部分特别有用,只是将它复制到我的项目中,因为我不想/需要包含整个JCS库,并且代码不能单独在其他地方使用(例如在apache中) commons-net会很好):

  • HostNameUtil Javadocs
  • HostNameUtil.java源码