Java如何判断两个IP是否是同一网段

在Java中,判断两个IP是否属于同一网段可以通过比较它们的网络地址和子网掩码来实现。网络地址和子网掩码可以通过IP地址和子网掩码的按位与操作得到。下面是一个具体的方案来解决这个问题。

步骤一:将IP地址和子网掩码转换为二进制表示

首先,我们需要将IP地址和子网掩码转换为二进制表示,以便进行按位与操作。这可以通过Java的InetAddress类来实现。

import java.net.InetAddress;

public class IPUtils {
    
    public static String getBinaryIP(String ipAddress) {
        try {
            InetAddress inetAddress = InetAddress.getByName(ipAddress);
            byte[] bytes = inetAddress.getAddress();
            StringBuilder binaryIP = new StringBuilder();
            for (byte b : bytes) {
                binaryIP.append(String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0'));
            }
            return binaryIP.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

上面的代码中,getBinaryIP方法接收一个IP地址作为参数,并返回该IP地址的二进制表示。

步骤二:比较网络地址

接下来,我们可以比较两个IP地址的网络地址部分是否相同。网络地址的计算方法是将IP地址和子网掩码进行按位与操作。

public class IPUtils {

    // ...

    public static boolean inSameNetwork(String ip1, String ip2, String subnetMask) {
        String binaryIP1 = getBinaryIP(ip1);
        String binaryIP2 = getBinaryIP(ip2);
        String binarySubnetMask = getBinaryIP(subnetMask);

        if (binaryIP1 != null && binaryIP2 != null && binarySubnetMask != null) {
            int subnetMaskLength = binarySubnetMask.indexOf('0');
            String networkAddress1 = binaryIP1.substring(0, subnetMaskLength);
            String networkAddress2 = binaryIP2.substring(0, subnetMaskLength);

            return networkAddress1.equals(networkAddress2);
        }

        return false;
    }
}

上述代码中,inSameNetwork方法接收两个IP地址和子网掩码作为参数,并返回一个布尔值,表示两个IP地址是否属于同一网段。其中,subnetMaskLength表示子网掩码的长度,networkAddress1networkAddress2分别表示两个IP地址的网络地址部分。

示例

下面是一个使用示例,假设我们需要判断IP地址192.168.1.10192.168.2.20是否属于同一网段,子网掩码为255.255.0.0

public class Main {

    public static void main(String[] args) {
        String ip1 = "192.168.1.10";
        String ip2 = "192.168.2.20";
        String subnetMask = "255.255.0.0";

        boolean sameNetwork = IPUtils.inSameNetwork(ip1, ip2, subnetMask);
        System.out.println("是否属于同一网段:" + sameNetwork);
    }
}

运行以上代码,将输出是否属于同一网段:false,表示192.168.1.10192.168.2.20不属于同一网段。

总结

通过以上方案,我们可以在Java中判断两个IP是否属于同一网段。首先,我们将IP地址和子网掩码转换为二进制表示,然后比较它们的网络地址部分是否相同。这种方法简单而有效,可以帮助我们解决实际问题中的IP判断需求。