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;
      }
      System.out.println('超网掩码为:' + mask); 
    }
    // 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;
      }
      System.out.println('超网掩码为:' + mask);
    }
    // C类
    if (x1 >= 192 && x1 <= 223) {
      mask = '255.255.255.' + sum;
      System.out.println('超网掩码为:' + mask);
    }
    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);
  }
}

程序说明:

该程序实现了 VLSM 子网划分功能,可以根据用户输入的 IP 地址和子网数量,计算超网掩码、子网掩码以及每个子网的 IP 范围。程序主要分为以下几个部分:

  1. 输入 IP 地址和子网数量: 程序首先提示用户输入要划分的 IP 地址和子网数量。
  2. 计算超网掩码: 程序根据用户输入的 IP 地址和子网数量,计算出超网掩码。
  3. 计算子网掩码: 程序根据超网掩码计算出子网掩码。
  4. 计算每个子网的 IP 范围: 程序根据超网掩码和子网数量计算出每个子网的 IP 范围。
  5. 输出结果: 程序将计算结果输出到控制台。

代码示例:

假设用户输入的 IP 地址为 192.168.1.0,子网数量为 4。程序将输出以下结果:

---------------划分子网---------------
请输入要划分的IP地址(格式为:x1.x2.x3.x4):
→:192.168.1.0
请输入要划分的子网数:
→:4
--------------------------------------
超网掩码为:255.255.255.240
子网掩码为: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
--------------------------------------
超网地址为:192.168.1.0/4
广播地址为:192.168.1.62

程序特点:

该程序实现了 VLSM 子网划分功能,并提供了以下特点:

  • 支持 A 类、B 类和 C 类 IP 地址。
  • 可以根据用户输入的子网数量,自动计算超网掩码和子网掩码。
  • 可以计算每个子网的 IP 范围,并输出到控制台。

应用场景:

该程序可以应用于以下场景:

  • 网络管理员可以使用该程序来进行子网划分,以优化网络资源的使用。
  • 学生可以使用该程序来学习 VLSM 子网划分原理。
  • 开发人员可以使用该程序来实现网络管理工具。

扩展:

该程序可以扩展以下功能:

  • 支持 IPv6 地址。
  • 提供图形界面。
  • 保存计算结果到文件。

代码解释:

代码中使用了 BufferedReader 类来读取用户输入,并使用 String 类和 Integer 类来处理字符串和数字。代码还使用了 Math.pow() 方法来进行幂运算,以及 & 运算符来进行位运算。

总结:

本程序实现了 VLSM 子网划分功能,可以根据用户输入的 IP 地址和子网数量,计算超网掩码、子网掩码以及每个子网的 IP 范围。该程序可以应用于网络管理、学习和开发等多个场景。

Java VLSM 子网划分器:超网掩码、IP 范围计算

原文地址: https://www.cveoy.top/t/topic/ojuW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录