java模拟路由表查询

计网课设中最简单的一题,随手做的,完成度极低,如果真拿去交估计只能及格?幸好组长大佬搞定了炫酷的题目,让我们白嫖高分。

由于图形化界面和数据持久化是其他组员做的,就不放上来了。

路由器:

public class Router {

    int[][] net;
    int[][] mask;
    String[] way;
    String s1,s2;

    //静态路由
    public Router(){

        //网络号
        net=new int[][]{
                {128,20,20,0},      //本路由器所在网络
                {192,168,5,10},     //特定主机
                {128,128,128,0},
                {123,123,123,0},
                {128,30,33,0},
                {0,0,0,0}           //默认路由
        };

        //掩码
        mask=new int[][]{
                {255,255,252,0},    //本路由器所在网络
                {255,255,255,255},  //特定主机
                {255,255,128,0},
                {255,255,255,0},
                {255,255,255,128},
                {0,0,0,0}           //默认路由
        };

        //下一跳
        way=new String[]{
                "直接交付",
                "路由器R2",
                "接口1",
                "接口2",
                "接口3",
                "路由器R3"
        };

        System.out.println("目的网络地址          掩码                 下一跳");
//        System.out.println("128.20.20.0         255.255.252.0       直接交付");
//        System.out.println("192.168.5.10        255.255.255.255     路由器R2");
//        System.out.println("128.128.128.0       255.255.128.0       接口1");
//        System.out.println("123.123.123.0       255.255.255.0       接口2");
//        System.out.println("128.30.33.0         255.255.255.128     接口3");
//        System.out.println("0.0.0.0             0.0.0.0             路由器R3");
        
        for (int i=0;i<net.length;i++){
            
            //格式化s1和s2,使之对齐
            //s1:目的网络地址
            s1 = net[i][0]+"."+net[i][1]+"."+net[i][2]+"."+net[i][3];
            s1 = padRight(s1,20);
            
            //s2:掩码
            s2 = mask[i][0]+"."+mask[i][1]+"."+mask[i][2]+"."+mask[i][3];
            s2 = padRight(s2,20);
            
            //绘制路由表
            System.out.println(s1+s2+way[i]);
            
        }
        
        
        System.out.println("请输入目的网络ip:");


    }

    public static String padRight(String origin, int length) {
        while (origin.length() < length) {
            origin = origin + " ";
        }
        return origin;

    }
    
    public void count(int[] ip){
        int j;
        for (int i=0;i<6;i++){//一共设置了六个路由表的内容,暂时不考虑动态变化或者可以扩展的路由表
            for ( j=0;j<4;j++){
                if ((ip[j]&mask[i][j])!=net[i][j]) {    //用户输入的ip和子网掩码相与,如果结果和目的网络不同,跳出循环
                    break;
                }
            }
            if (j==4){//如果j等于4,说明4个点分十进制数都和目的网络号相等,也就是输入的ip地址所在的网络存在
                System.out.println(way[i]);//计算完毕,输出目的网络
                break;
            }
        }
    }
    

}

main:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Router router=new Router();
        Scanner sc=new Scanner(System.in);
        boolean right;



        //循环查找吓一跳
        while(true) {
            right = true;
            String temp = sc.nextLine();//输入ip地址
            String[] num = new String[]{"","","",""};//输入的ip地址存储
            int[] numm = new int[4];                 //ip地址转化为int
            int j = 0;
            
            //输入ip地址
            try {
                for (int i = 0; i < temp.length(); i++) {
                    if (temp.charAt(i) != '.') {
                        num[j] += temp.charAt(i);       //把被小数点分开的数字分别存到num数组中
                    } else {
                        numm[j] = Integer.parseInt(num[j]);//把num数组中String数字转化为int
                        if(numm[j]>255){
                            System.out.println("ip地址格式错误!");
                            right = false;
                            break;
                        }
                        j++;
                    }
                    if (i == temp.length() - 1) {
                        numm[j] = Integer.parseInt(num[j]);//漏了最后一个数字,补上
                        if(numm[j]>255){
                            System.out.println("ip地址格式错误!");
                            right = false;
                            break;
                        }
                    }
                }
            }catch (Exception e){
                System.out.println("ip地址格式错误!");
                right = false; 
            }


            if (right) {
                router.count(numm);//开始计算下一跳
            }

        }


    }
}

嗯,这是有信心拿59分的水准。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现的更新需要考虑以下几个步骤: 1. 定义数据结构:首先需要定义一个数据结构来存储由信息,一般包括目的网络地址、下一跳地址、接口等信息。 2. 读取:将现有的读入内存中,可以从文件或者数据库中读取。 3. 更新:根据新的由信息更新,包括添加新的由项、更新已有的由项、删除不再可达的由项等操作。 4. 写入:将更新后的写入文件或者数据库中,以便下一次使用。 下面是一个简单的Java代码示例,用于更新: ``` public class RouteTable { // 定义数据结构 private List<RouteEntry> entries = new ArrayList<>(); // 读取 public void read() { // 从文件或者数据库中读取信息,添加到entries列中 } // 更新 public void update(RouteEntry entry) { // 根据新的由信息更新 for (RouteEntry e : entries) { // 如果已有的由项与新的由项的目的网络地址一致,则更新该由项 if (e.getDestNetwork().equals(entry.getDestNetwork())) { e.setNextHop(entry.getNextHop()); e.setInterface(entry.getInterface()); return; } } // 否则,添加新的由项 entries.add(entry); } // 删除项 public void delete(String destNetwork) { Iterator<RouteEntry> it = entries.iterator(); while (it.hasNext()) { RouteEntry e = it.next(); if (e.getDestNetwork().equals(destNetwork)) { it.remove(); return; } } } // 写入 public void write() { // 将信息写入文件或者数据库中 } } ``` 以上代码只是一个简单的示例,实际的更新操作可能会更加复杂,需要根据具体的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值