在Java中计算子网掩码及其对应的起始IP和终止IP是网络编程中常见的需求。本文将详细介绍如何通过Java编写一个工具类来完成这一任务。

首先,让我们明确一下基本概念:

  • IP地址:一个32位的地址,用于标识网络中的设备。
  • 子网掩码:也由32位组成,用于分割IP地址的网络部分和主机部分。
  • 起始IP:子网中的第一个IP地址。
  • 终止IP:子网中的最后一个IP地址。

工具类设计

我们需要编写一个工具类 SubnetUtils,该类能够接收IP地址和子网掩码,并计算出子网的起始IP和终止IP。

主要步骤:

  1. 将IP地址和子网掩码转换为二进制格式。
  2. 计算网络地址。
  3. 根据网络地址和子网掩码计算起始IP和终止IP。

工具类代码实现

以下是 SubnetUtils工具类的完整代码实现:

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

public class SubnetUtils {
    private final String ipAddress;
    private final String subnetMask;

    public SubnetUtils(String ipAddress, String subnetMask) {
        this.ipAddress = ipAddress;
        this.subnetMask = subnetMask;
    }

    public String getNetworkAddress() throws UnknownHostException {
        byte[] ip = InetAddress.getByName(ipAddress).getAddress();
        byte[] mask = InetAddress.getByName(subnetMask).getAddress();
        byte[] network = new byte[ip.length];

        for (int i = 0; i < ip.length; i++) {
            network[i] = (byte) (ip[i] & mask[i]);
        }
        return InetAddress.getByAddress(network).getHostAddress();
    }

    public String getStartIPAddress() throws UnknownHostException {
        byte[] network = InetAddress.getByName(getNetworkAddress()).getAddress();
        network[3] += 1;
        return InetAddress.getByAddress(network).getHostAddress();
    }

    public String getEndIPAddress() throws UnknownHostException {
        byte[] broadcast = getBroadcastAddress();
        broadcast[3] -= 1;
        return InetAddress.getByAddress(broadcast).getHostAddress();
    }

    public byte[] getBroadcastAddress() throws UnknownHostException {
        byte[] ip = InetAddress.getByName(ipAddress).getAddress();
        byte[] mask = InetAddress.getByName(subnetMask).getAddress();
        byte[] broadcast = new byte[ip.length];

        for (int i = 0; i < ip.length; i++) {
            broadcast[i] = (byte) (ip[i] | ~mask[i]);
        }
        return broadcast;
    }

    public static void main(String[] args) throws UnknownHostException {
        SubnetUtils subnetUtils = new SubnetUtils("192.168.1.10", "255.255.255.0");
        System.out.println("Network Address: " + subnetUtils.getNetworkAddress());
        System.out.println("Start IP Address: " + subnetUtils.getStartIPAddress());
        System.out.println("End IP Address: " + subnetUtils.getEndIPAddress());
    }
}

代码详解

构造函数

public SubnetUtils(String ipAddress, String subnetMask) {
    this.ipAddress = ipAddress;
    this.subnetMask = subnetMask;
}
  • 参数:
    • ipAddress:传入的IP地址。
    • subnetMask:传入的子网掩码。

获取网络地址

public String getNetworkAddress() throws UnknownHostException {
    byte[] ip = InetAddress.getByName(ipAddress).getAddress();
    byte[] mask = InetAddress.getByName(subnetMask).getAddress();
    byte[] network = new byte[ip.length];

    for (int i = 0; i < ip.length; i++) {
        network[i] = (byte) (ip[i] & mask[i]);
    }
    return InetAddress.getByAddress(network).getHostAddress();
}
  • 步骤:
    • 将IP地址和子网掩码转换为字节数组。
    • 进行按位与运算以获取网络地址。
    • 将网络地址转换回字符串格式。

获取起始IP地址

public String getStartIPAddress() throws UnknownHostException {
    byte[] network = InetAddress.getByName(getNetworkAddress()).getAddress();
    network[3] += 1;
    return InetAddress.getByAddress(network).getHostAddress();
}
  • 步骤:
    • 获取网络地址。
    • 将网络地址的最后一个字节加1。
    • 将起始IP地址转换回字符串格式。

获取终止IP地址

public String getEndIPAddress() throws UnknownHostException {
    byte[] broadcast = getBroadcastAddress();
    broadcast[3] -= 1;
    return InetAddress.getByAddress(broadcast).getHostAddress();
}
  • 步骤:
    • 获取广播地址。
    • 将广播地址的最后一个字节减1。
    • 将终止IP地址转换回字符串格式。

获取广播地址

public byte[] getBroadcastAddress() throws UnknownHostException {
    byte[] ip = InetAddress.getByName(ipAddress).getAddress();
    byte[] mask = InetAddress.getByName(subnetMask).getAddress();
    byte[] broadcast = new byte[ip.length];

    for (int i = 0; i < ip.length; i++) {
        broadcast[i] = (byte) (ip[i] | ~mask[i]);
    }
    return broadcast;
}
  • 步骤:
    • 将IP地址和子网掩码转换为字节数组。
    • 进行按位或运算以获取广播地址。
    • 返回广播地址的字节数组形式。

测试

可以通过 main方法测试该工具类:

public static void main(String[] args) throws UnknownHostException {
    SubnetUtils subnetUtils = new SubnetUtils("192.168.1.10", "255.255.255.0");
    System.out.println("Network Address: " + subnetUtils.getNetworkAddress());
    System.out.println("Start IP Address: " + subnetUtils.getStartIPAddress());
    System.out.println("End IP Address: " + subnetUtils.getEndIPAddress());
}

分析说明表

功能 说明
构造函数 初始化工具类,接收IP地址和子网掩码。
getNetworkAddress 计算并返回网络地址。
getStartIPAddress 计算并返回子网的起始IP地址。
getEndIPAddress 计算并返回子网的终止IP地址。
getBroadcastAddress 计算并返回广播地址。
main 测试工具类功能。

通过以上代码实现,我们可以轻松计算给定IP和子网掩码的网络地址、起始IP地址和终止IP地址。这种工具类在网络编程和网络管理中非常实用。