在Java中计算子网掩码及其对应的起始IP和终止IP是网络编程中常见的需求。本文将详细介绍如何通过Java编写一个工具类来完成这一任务。
首先,让我们明确一下基本概念:
- IP地址:一个32位的地址,用于标识网络中的设备。
- 子网掩码:也由32位组成,用于分割IP地址的网络部分和主机部分。
- 起始IP:子网中的第一个IP地址。
- 终止IP:子网中的最后一个IP地址。

工具类设计
我们需要编写一个工具类 SubnetUtils,该类能够接收IP地址和子网掩码,并计算出子网的起始IP和终止IP。
主要步骤:
- 将IP地址和子网掩码转换为二进制格式。
- 计算网络地址。
- 根据网络地址和子网掩码计算起始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地址。这种工具类在网络编程和网络管理中非常实用。


