Java VLSM 子网划分器代码详解
这段代码是一个 Java 实现的 VLSM (可变长子网掩码) 子网划分器,它能够根据用户输入的 IP 地址和所需子网数量,计算出子网掩码、超网地址、广播地址以及每个子网的 IP 地址范围。
以下是对代码的详细解释,并对关键部分进行了补充说明:
package 子网划分器;
import java.io.*;
public class VLSM {
/**
* @param args
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String ip; // 用于接收要划分的IP
int s; // 用于接收以要划分的子网数
int n; // 输入子网数对应的二进制位数
System.out.println('---------------划分子网---------------');
// 输入要划分的IP地址:ip
System.out.println('请输入要划分的IP地址(格式为:x1.x2.x3.x4):');
System.out.print('→:');
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
ip = br.readLine();
// 截取x1
int index1 = ip.indexOf('.');
String st1 = ip.substring(0, index1);
int x1 = Integer.parseInt(st1);// 把String类型的st转化成int型
// 截取x2
int index2 = ip.indexOf('.', index1 + 1);
String st2 = ip.substring(index1 + 1, index2);
int x2 = Integer.parseInt(st2);// 把String类型的st转化成int型
// 截取x3
int index3 = ip.indexOf('.', index2 + 1);
String st3 = ip.substring(index2 + 1, index3);
int x3 = Integer.parseInt(st3);// 把String类型的st转化成int型
// 截取x4
// A类
if (x1 > 0 && x1 <= 126) {
System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 24 - 2) - 2));
}
// B类
if (x1 >= 128 && x1 <= 191) {
System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 16 - 2) - 2));
}
// C类
if (x1 >= 192 && x1 <= 223) {
System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 8 - 2) - 2));
}
// 输入要划分的子网数数:s
System.out.println('请输入要划分的子网数:');
System.out.print('→:');
String subnet_num = br.readLine();
s = Integer.parseInt(subnet_num);
br.close();
// 求所输入子网数对应的二进制位数:n
for (n = 1; (Math.pow(2, n) - 2) < s; n++);
System.out.println('--------------------------------------');
// 获取超网掩码
int sum = 0;
for (int i = 0; i < n; i++) {
sum = sum + (int) Math.pow(2, (7 - i));
}
String mask = '';
// A类
if (x1 > 0 && x1 <= 126) {
if (n <= 8) {
mask = '255.' + sum + '.0.0';
} else if (n > 8 && n <= 16) {
n = n - 8;
sum = 0;
for (int i = 0; i < n; i++) {
sum = sum + (int) Math.pow(2, (7 - i));
}
mask = '255.255.' + sum + '.0';
} else {
n = n - 16;
sum = 0;
for (int i = 0; i < n; i++) {
sum = sum + (int) Math.pow(2, (7 - i));
}
mask = '255.255.255.' + sum;
}
}
// B类
if (x1 >= 128 && x1 <= 191) {
if (n <= 8) {
mask = '255.255.' + sum + '.0';
} else {
n = n - 8;
sum = 0;
for (int i = 0; i < n; i++) {
sum = sum + (int) Math.pow(2, (7 - i));
}
mask = '255.255.255.' + sum;
}
}
// C类
if (x1 >= 192 && x1 <= 223) {
mask = '255.255.255.' + sum;
}
System.out.println('子网掩码为:' + mask);
// 计算超网地址和广播地址
int currentNetId = 0;
int currentHostId = 1;
String currentIP = x1 + '.' + x2 + '.' + x3 + '.' + currentHostId;
String lastIP = '';
String broadcastIP = '';
while (true) {
if ((currentHostId & ((int) Math.pow(2, (n - 1))) - 1) == 0) {
if (!lastIP.isEmpty()) {
broadcastIP = currentIP.substring(0, currentIP.lastIndexOf('.')) + '.' + (currentHostId - 2);
System.out.println('子网' + currentNetId + '的 IP 范围:' + lastIP + ' 到 ' + broadcastIP);
}
lastIP = currentIP;
currentNetId++;
// B类地址,当网络号是0的时候跳过,因为这个地址保留不使用
if (x1 >= 128 && x1 <= 191 && currentNetId == 1) {
currentNetId++;
}
if (currentNetId == s) {
break;
}
}
currentHostId++;
currentIP = x1 + '.' + x2 + '.' + x3 + '.' + currentHostId;
}
broadcastIP = currentIP.substring(0, currentIP.lastIndexOf('.')) + '.' + (currentHostId - 2);
System.out.println('子网' + currentNetId + '的 IP 范围:' + lastIP + ' 到 ' + broadcastIP);
System.out.println('--------------------------------------');
System.out.println('超网地址为:' + ip + '/' + n);
System.out.println('广播地址为:' + broadcastIP);
}
}
代码功能解析:
- 接收输入:程序首先从用户那里获取要划分的 IP 地址和所需的子网数量。
- 判断 IP 地址类别:根据 IP 地址的第一个字节,判断其属于 A 类、B 类还是 C 类地址。
- 计算子网掩码:
- 首先根据子网数量计算出所需二进制位数。
- 然后根据二进制位数和 IP 地址类别,计算出子网掩码。
- 计算子网范围:根据子网掩码和 IP 地址,计算出每个子网的起始 IP 地址和结束 IP 地址(广播地址)。
- 计算超网地址和广播地址:根据计算结果,输出超网地址和广播地址。
代码细节说明:
- 子网数量的计算:代码中使用了
Math.pow(2, n) - 2来计算子网数量。这是因为在每个子网中,第一个地址和最后一个地址分别被用作网络地址和广播地址,不能分配给主机使用。 - 子网掩码的计算:代码中使用循环计算子网掩码,将每个二进制位的值加到
sum中,然后根据 IP 地址类别将sum拼接到子网掩码字符串中。 - 子网范围的计算:代码使用了一个
while循环,不断计算每个子网的 IP 地址范围。 - 超网地址的计算:超网地址即原始 IP 地址和子网掩码的组合,例如
192.168.1.0/24。 - 广播地址的计算:广播地址为每个子网的最后一个 IP 地址,即在网络地址的基础上将主机号部分全部置为 1。
代码示例:
假设用户输入要划分的 IP 地址为 192.168.1.0,子网数量为 8。
程序将输出如下结果:
---------------划分子网---------------
请输入要划分的IP地址(格式为:x1.x2.x3.x4):
→:192.168.1.0
本IP地址能划分划分的最大子网数为: 254
请输入要划分的子网数:
→:8
--------------------------------------
子网掩码为:255.255.255.240
子网0的 IP 范围:192.168.1.1 到 192.168.1.14
子网1的 IP 范围:192.168.1.15 到 192.168.1.30
子网2的 IP 范围:192.168.1.31 到 192.168.1.46
子网3的 IP 范围:192.168.1.47 到 192.168.1.62
子网4的 IP 范围:192.168.1.63 到 192.168.1.78
子网5的 IP 范围:192.168.1.79 到 192.168.1.94
子网6的 IP 范围:192.168.1.95 到 192.168.1.110
子网7的 IP 范围:192.168.1.111 到 192.168.1.126
子网8的 IP 范围:192.168.1.127 到 192.168.1.142
--------------------------------------
超网地址为:192.168.1.0/28
广播地址为:192.168.1.142
这段代码示例展示了 VLSM 的实际应用。通过划分子网,可以有效地利用 IP 地址,并根据不同的网络需求进行灵活的配置。
希望本代码解析能够帮助您更好地理解 VLSM 的原理和实现。
原文地址: http://www.cveoy.top/t/topic/ojHn 著作权归作者所有。请勿转载和采集!