rip协议java模拟实现
来源:互联网 发布:svm算法步骤 编辑:程序博客网 时间:2024/06/07 08:35
大二下学期的计算机网络原理课程设计
已同步github
url:https://github.com/leiflee/ripdemo
git:https://github.com/leiflee/ripdemo.git
一、设计题目:距离矢量路由选择算法的模拟实现
二、设计要求
(1)掌握距离矢量路由选择选择算法的工作原理。
(2)采用C、Java等编程语言实现距离矢量路由选择选择算法。
算法输入:
带权图G,如图1所示。
算法输出:
(1)某个顶点v(路由器)在第i次周期后的整个路由表。
(2)路由表的结构<目的网络,跳数,下一跳>
三、设计思路
距离矢量路由选择选择算法有多种,本设计采用的是比较经典的RIP协议,根据设计要求,只要求输出路由器在第i次周期后的整个路由表,为突出设计要求,本设计简化了RIP协议,与RIPv1,RIPv2和RIPng相比,本设计精简了水平分割、毒性逆转和抑制计时功能,本设计采用手动触发更新,即:手动输入循环周期i次,然后执行i次更新,并输出结果。
系统中涉及到三个对象,network,router,routertable,分别表示网络空间,路由器,路由表。其中,系统一共具有1个网络,网络中包括至少一个路由器,每个路由器拥有一个路由表。
系统执行大致分为三个阶段:
阶段一,系统读取配置文件./config/network.properties,通过其中的配置项来初始化网络空间,建立路由表,建立邻接关系。
阶段二,系统提示用户输入周期i,用户将输入反馈给系统。
阶段三,系统根据用户输入,执行响应轮次的路由表更新,输出结果。
配置文件书写规则:
e.g.
routernum=6 //路由器数量networknum=7 //网络数量0=0 //左侧表示路由器编号,右侧表示网络编号1=0,1,3,4 //路由器和网络号都从0开始计数2=1,2 //右侧为该路由器连接的网络,中间用英文","隔开3=3,64=35=4,5
四、源码
//Index.java 主类package rip;import java.util.Scanner;public class Index { public static void main(String[] args){ Network network = new Network(); network.initNetwork(); network.setnearRouter(); System.out.print("请输入循环轮次:"); Scanner in = new Scanner(System.in); int i = in.nextInt(); in.close(); for(int j = 0; j < i; j++){ System.out.println("=========================循环轮次"+(j+1)+"==========================="); network.changeAllRouter(); } }}
//Network.java 网络空间类package rip;import java.util.HashMap;public class Network { private int routernum; private int networknum; public Router[] routers; public int getRouternum() { return routernum; } public void setRouternum(int routernum) { this.routernum = routernum; } public int getNetworknum() { return networknum; } public void setNetworknum(int networknum) { this.networknum = networknum; } public Router[] getRouters() { return routers; } public void setRouters(Router[] routers) { this.routers = routers; } public Network() { super(); } public void initNetwork(){ HashMap<String, String[]> netconf = Util.readNetworkConfig(); setRouternum(Integer.parseInt(netconf.get("routernum")[0])); setNetworknum(Integer.parseInt(netconf.get("networknum")[0])); //TODO 建立各路由器以及路由表 !important Router routerssss[] = new Router[routernum]; for (int i = 0; i < routernum; i++) { HashMap<Integer, String[]> list = new HashMap<>(); String[] strings = netconf.get(String.valueOf(i)); for(int j = 0; j < strings.length;j++){ String[] temp = {strings[j],"1", String.valueOf(i)}; list.put(j, temp); } RouterTable routerTable = new RouterTable(list, i); Router router = new Router(i, routerTable); routerssss[i] = router; } setRouters(routerssss); } public void setnearRouter(){ for (int i = 0; i < routers.length; i++) { String str1 = Util.intArray2string(routers[i].getNearNetwork()); String str3 = ""; for(int j = 0; j < routers.length; j++){ String str2 = Util.intArray2string(routers[j].getNearNetwork()); for(int k = 0; k < str2.length(); k++){ if (str1.contains(str2.substring(k, k+1))) { str3 += j; break; } } } if (str3.length() > 0) { int p[] = new int[str3.length()]; for (int j = 0; j < str3.length(); j++) { p[j] = Integer.parseInt(str3.substring(j, j+1)); } routers[i].setNearRouter(p); } } } public void changeAllRouter(){ //TODO for 循环,每个路由器获取其临近路由器的路由表,然后更新自己的路由表 for(int i = 0; i < routers.length; i++){// System.out.println("外循环********************路由器"+i+"开始获取路由表"); for(int j = 0; j < routers[i].getNearRouter().length; j++){// System.out.println("内循环********************路由器了获取路由表"+j); routers[i].changeRouterTable(routers[routers[i].getNearRouter()[j]].getRouterTable()); } routers[i].echoRoutertable(); } }}
// Router.java 路由器类package rip;import java.util.HashMap;public class Router { private final int routerId; private RouterTable routerTable; private int[] nearRouter; private int[] nearNetwork; public RouterTable getRouterTable() { return routerTable; } public void setRouterTable(RouterTable routerTable) { this.routerTable = routerTable; } public void changeRouterTable(RouterTable otherRouterTable){ // 规则: // 1. 传入的为其临近路由器的路由表 // 2. 解析路由表 // 3. 如果有自己路由表里有的网络,检查跳数是否为15,不为15进行以下操作 // 4. 如果“跳数+1” 小于 本路由表对应条目的跳数,则修改记录 // 5. 修改记录 “网络号(不变)”,“跳数+1”,“下一跳路由(该路由条目的来源路由)” // 6. else如果有本自己路由表里没有的网路,检查跳数是否为15,不为15进行以下操作 // 7. 添加记录 “网络号”,“跳数+1”,“下一跳路由(该路由条目的来源路由)” //将自己的路由表里 所有的网络号建立一个String,所有的跳数建立一个String, //遍历外来路由表的各个网络号,判断是否存在相同的值 //如果存在 判断跳数(1.是否不等于15,2,是否小于自己对应的跳数+1) // 如果满足,修改路由表对应数据 // 如果不满足。do nothing //如果不存在,判断跳数是否不等于15, // 如果满足,添加该路由条目 HashMap<Integer, String[] > otherList = otherRouterTable.getList(); HashMap<Integer, String[] > selfList = routerTable.getList(); String otherNetnum = ""; String otherTiaonum = ""; String selfNetnum = ""; String selfTiaonum = ""; String selfShouldMod = ""; String otherShouldMod = ""; String shouldAdd = ""; for(int i = 0 ; i < otherList.size(); i++){ otherNetnum += otherList.get(i)[0]; otherTiaonum += otherList.get(i)[1]; } for(int i = 0; i < selfList.size(); i++){ selfNetnum += selfList.get(i)[0]; selfTiaonum += selfList.get(i)[1]; } for(int i = 0; i < otherNetnum.length(); i++){// System.out.println("第"+i+"循环检验========================"); int res = selfNetnum.indexOf(otherNetnum.substring(i,i+1)); int p = Integer.parseInt(otherTiaonum.substring(i, i+1)); if (res != -1) { int q = Integer.parseInt(selfTiaonum.substring(res, res+1)); if (p < 15) { if ((p+1) < q ) { //TODO 修改路由表对应数据// System.out.println("premod======="+selfNetnum.substring(res, res+1)+"--------"+otherNetnum.substring(i,i+1)); selfShouldMod += String.valueOf(res); otherShouldMod += String.valueOf(i); } } }else if (res == -1) { if (p < 15) { //TODO 添加该条目// System.out.println("preadd====="+otherNetnum.substring(i,i+1)); shouldAdd += String.valueOf(i); } }else { System.err.println("core change err"); } } if (selfShouldMod.length() > 0) { for(int i = 0; i < selfShouldMod.length(); i++){// System.out.println("mod"); selfList.remove(selfShouldMod.substring(i,i+1)); String newChange[] = { otherList.get(Integer.parseInt(otherShouldMod.substring(i, i+1)))[0], String.valueOf(Integer.parseInt(otherList.get(Integer.parseInt(otherShouldMod.substring(i,i+1)))[1])+1), String.valueOf(otherRouterTable.getRouterID()) }; selfList.put(Integer.parseInt(selfShouldMod.substring(i,i+1)), newChange); } } if (shouldAdd.length() > 0) {// System.out.println("1111111111111self.size================="+selfList.size()); int len = selfList.size(); for(int i = 0; i < shouldAdd.length(); i++){// System.out.println("add"); String newChange[] = { otherList.get(Integer.parseInt(shouldAdd.substring(i, i+1)))[0], String.valueOf(Integer.parseInt(otherList.get(Integer.parseInt(shouldAdd.substring(i,i+1)))[1])+1), String.valueOf(otherRouterTable.getRouterID()) }; selfList.put(len+i, newChange);// System.out.println("self.size================="+selfList.size()); } } routerTable.setList(selfList); setRouterTable(routerTable); } public int[] getNearRouter() { return nearRouter; } public void setNearRouter(int[] nearRouter) { this.nearRouter = nearRouter; } public int[] getNearNetwork() { return nearNetwork; } public void setNearNetwork(int[] nearNetwork) { this.nearNetwork = nearNetwork; } public int getRouterId() { return routerId; } public void echoRoutertable(){ RouterTable rtTables = getRouterTable(); HashMap<Integer, String[]> list = rtTables.getList(); System.out.println("*******路由器 "+getRouterTable().getRouterID()+" 路由表******"); for (int i = 0; i < list.size(); i++) { String[] pStrings = list.get(i); System.out.println("网络:"+pStrings[0]+" | "+"跳数:"+pStrings[1]+" | "+"下一跳路由器: "+pStrings[2]); } } public Router(int routerId, RouterTable routerTable) { super(); this.routerId = routerId; this.routerTable = routerTable; //TODO 记录临近的网络 int[] p = new int[routerTable.getList().size()]; for(int i = 0; i < routerTable.getList().size(); i++){ p[i] = Integer.parseInt(routerTable.getList().get(i)[0]); } this.nearNetwork = p; }}
// RouterTable.java 路由表类package rip;import java.util.HashMap;public class RouterTable { private HashMap<Integer, String[] > list; private int routerID; public HashMap<Integer, String[]> getList() { return list; } public void setList(HashMap<Integer, String[]> list) { this.list = list; } public int getRouterID() { return routerID; } public void setRouterID(int routerID) { this.routerID = routerID; } public RouterTable(HashMap<Integer, String[]> list, int routerID) { super(); this.list = list; this.routerID = routerID; }}
// Util.java 通用函数类package rip;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.Enumeration;import java.util.HashMap;import java.util.Properties;public class Util { private final static String propertiesUrl = "./config/network.properties";/** * 读取网络配置信息 * ###网络配置信息相关文档见readme.md * @return hashmap */ public static HashMap<String, String[]> readNetworkConfig(){ HashMap<String, String[]> netconf = new HashMap<>(); Properties Networkconfig = new Properties(); try { Networkconfig.load(new FileInputStream(propertiesUrl)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } @SuppressWarnings("rawtypes") Enumeration enumm = Networkconfig.propertyNames(); while(enumm.hasMoreElements()) { String strKey = (String) enumm.nextElement(); String strValue = Networkconfig.getProperty(strKey); String[] strValueArray = strValue.split(","); netconf.put(strKey, strValueArray); } return netconf; } /** * 将int[]数组转为string * @param intarr int[] * @return string */ public static String intArray2string(int intarr[]){ String string = ""; for(int i = 0; i < intarr.length; i++){ string += String.valueOf(intarr[i]); } return string; } public static String callCmd(String cmd) throws IOException, InterruptedException { // 使用Runtime来执行command,生成Process对象 Process process = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", cmd }); // int exitCode = process.waitFor(); // 取得命令结果的输出流 InputStream is = process.getInputStream(); // 用一个读输出流类去读 InputStreamReader isr = new InputStreamReader(is); // 用缓冲器读行 BufferedReader br = new BufferedReader(isr); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { System.out.println(line); sb.append(line); } is.close(); isr.close(); br.close(); return sb.toString(); }}
2 0
- rip协议java模拟实现
- 实现rip路由选择协议
- rip协议实现-网络实验6
- rip协议
- RIP协议
- RIP协议
- RIP协议
- RIP协议
- RIP协议
- RIP协议
- RIP协议
- python实现基于向量算法的的路由协议(RIP)
- RIP协议概述
- rip协议配置命令
- 路由信息协议(RIP)
- 路由信息协议(RIP)
- RIP路由协议
- RIP协议配置
- Animation 动画介绍和实现
- 鞋码的尺寸
- 图像处理之USM锐化
- Git入门(四)——没有版本控制意识的程序员不是一个好的程序员
- 读书笔记:《算法导论》,第2章:算法基础
- rip协议java模拟实现
- Spring security 4 之 SSO+Form两种登录方式
- setAttribute方法
- 对计算机专业大一新生的忠告
- 精度、误差与分辨率的研究
- UVa 11426--算法竞赛入门经典训练指南
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- There is no getter for property named 'xxx' in 'class com.xuezhixin.mls.web.model.yyy
- ZooKeeper环境配置