Java 判断IP号段

引言

在网络中,每个设备都有一个唯一的IP地址,用于标识其在网络中的位置。IP地址由一系列数字组成,共有四个部分,每个部分范围从0到255。为了方便管理和使用,IP地址通常会被划分为多个号段,每个号段代表一组IP地址。在Java中,我们可以使用一些方法来判断一个IP地址是否属于某个特定的号段。

本文将介绍如何使用Java编写代码来判断一个IP地址是否属于指定的号段。我们将首先介绍IP地址的基本知识,然后讨论Java中的相关类和方法,最后给出一个完整的示例代码。

IP地址的基本知识

IP地址由四个部分组成,每个部分由一个0到255之间的数字表示。例如,一个IP地址可以是192.168.1.1。其中,192是第一个部分,168是第二个部分,以此类推。

IP地址通常被分为两类:公有IP地址和私有IP地址。公有IP地址是由互联网服务提供商(ISP)分配的,用于标识一个设备在公共互联网中的唯一位置。私有IP地址是在局域网中使用的,用于标识设备在局域网中的唯一位置。私有IP地址通常以以下范围开头:

  • 10.0.0.0 到 10.255.255.255
  • 172.16.0.0 到 172.31.255.255
  • 192.168.0.0 到 192.168.255.255

除了私有IP地址,还有一些其他的号段用于特殊用途,比如回环地址(127.0.0.1)和广播地址。

Java中的IP地址类

Java中的InetAddress类提供了一些方法来处理IP地址。我们可以使用这些方法来判断一个IP地址是否属于指定的号段。

getByName()方法

getByName(String host)方法用于根据主机名(例如www.example.com)或IP地址(例如192.168.1.1)获取对应的InetAddress对象。如果无法解析主机名或IP地址,则会抛出UnknownHostException异常。

import java.net.InetAddress;
import java.net.UnknownHostException;

try {
    InetAddress address = InetAddress.getByName("192.168.1.1");
    System.out.println("Host name: " + address.getHostName());
    System.out.println("IP address: " + address.getHostAddress());
} catch (UnknownHostException e) {
    e.printStackTrace();
}

上述代码将输出:

Host name: 192.168.1.1
IP address: 192.168.1.1

isReachable()方法

isReachable(int timeout)方法用于判断一个IP地址是否可达。它会向目标主机发送一个ICMP(Internet Control Message Protocol)回显请求,并等待回复。如果在指定的超时时间内收到回复,则说明目标主机可达;否则,说明目标主机不可达。

import java.io.IOException;
import java.net.InetAddress;

try {
    InetAddress address = InetAddress.getByName("192.168.1.1");
    boolean reachable = address.isReachable(5000); // 超时时间为5秒
    System.out.println("Reachable: " + reachable);
} catch (IOException e) {
    e.printStackTrace();
}

上述代码将输出:

Reachable: true

判断IP号段的方法

要判断一个IP地址是否属于指定的号段,我们可以将IP地址和号段都转换为整数,然后比较它们的大小关系。如果IP地址大于或等于号段的起始地址,并且小于或等于号段的结束地址,则说明该IP地址属于该号段。

下面是一个示例的判断方法:

public static boolean isIPInRange(String ip, String startIP, String endIP) {
    long ipLong = ipToLong(ip);
    long startIPLong = ipToLong(startIP);
    long endIPLong = ipToLong(endIP);
    return ipLong >= startIPLong && ipLong <= endIPLong;
}