在本教程中,我们探索了使用 Java 扫描和检索同一子网内连接的 IP 地址列表的不同方法。
为了简单起见,我们使用了InetAddress类,使用了 Java 8 的 Stream API 进行简洁的函数编程,并使用 Apache Commons Net 库进行更强大的子网处理和端口扫描等高级任务。
在网络中,检索同一网络(子网)内连接的IP 地址列表对于网络监控和设备管理等任务至关重要。此外,这还有助于识别特定 IP 范围内的活动设备并确保它们可访问。
在本教程中,我们将探索 Java 中用于扫描和检索同一子网内 IP 地址列表的各种方法。我们将介绍使用 Java 的InetAddress类的解决方案以及使用 Java 8 Stream API 的增强功能。最后,我们将使用 Apache Commons Net 库演示更高级的子网处理。
了解 IP 地址和子网
IP 地址可唯一标识网络上的设备,而子网则将一系列 IP 地址组合在一起。子网可将网络划分为更小、更易于管理的块,有助于提高性能和安全性。
子网通常由 IP 地址和子网掩码表示(例如192.168.1.0/24)。子网掩码定义 IP 地址的哪一部分代表网络,哪一部分标识单个主机。
例如,子网192.168.1.0/24涵盖从192.168.1.1到192.168.1.254的所有地址。在这种情况下,前三个八位字节(192.168.1)代表网络,最后一个八位字节可以是 1 到 254 之间的任意数字,用于标识各个主机。
子网掩码255.255.255.0表示 IP 地址的前三部分代表网络,而最后一部分则因主机而异。
让我们看看如何在 Java 中动态确定子网:
private String getSubnet() throws UnknownHostException { |
此方法检索本地计算机的 IP 地址,我们从前三个八位字节中提取子网。代码根据环境动态计算子网,使其能够适应不同的网络配置。
使用 Java 的InetAddress类
检查网络中设备可达性的最简单方法之一是使用 Java 的InetAddress类。此外,此类允许我们验证特定 IP 地址的设备在给定的超时期限内是否可以到达。
一旦我们动态确定了子网,我们就可以通过从 1 到 254 的数字附加到基地址来循环遍历子网内可能的 IP 地址:
@Test |
对于每个 IP,我们使用InetAddress.getByName()方法创建一个InetAddress对象。然后,我们使用isReachable()方法检查它是否可访问。如果设备可访问,我们将 IP 地址添加到列表中。
IP 地址列表将根据当前连接到同一网络的设备而有所不同。
使用 Java 8 Stream API 简化子网扫描
Java 8 引入了Stream API,让我们能够以简洁、实用的方式处理集合和数组。此外,我们可以利用此功能以精简的方式执行子网扫描:
@Test |
这里,我们使用IntStream.rangeClosed(1, 254)来生成可能的 IP 地址范围。然后我们使用mapToObj()将生成的数字附加到动态检索的子网,并使用 filter()检查每个 IP 是否可访问。
虽然这并没有引入新的网络功能,但它展示了如何使用 Stream API(Java 8 中引入的强大功能)来组织和简化解决方案。
使用 Apache Commons Net Library 进行高级子网处理
对于更高级的子网管理,我们可以使用Apache Commons Net库,它提供了一些实用程序来轻松处理子网。此库的一个用例是使用TelnetClient ( Apache Commons Net 库提供的SocketClient的子类) 检查子网内设备上的开放端口(例如端口 80) :
@Test |
在此示例中,SubnetUtils生成子网内所有有效的 IP 地址(例如192.168.1.0/24)。对于每个 IP 地址,我们尝试使用TelnetClient.connect()方法连接到端口 80。连接成功后,系统会将 IP 地址添加到具有开放端口的设备列表中。然后,它在finally块中使用telnetClient.disconnect()关闭连接,以确保正确的资源管理。