计网课设中最简单的一题,随手做的,完成度极低,如果真拿去交估计只能及格?幸好组长大佬搞定了炫酷的题目,让我们白嫖高分。
由于图形化界面和数据持久化是其他组员做的,就不放上来了。
路由器:
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分的水准。