1. 程式人生 > >rip協議java模擬實現

rip協議java模擬實現

大二下學期的計算機網路原理課程設計

之前整理了github,換了地址,忘了更新了,感謝評論提醒,現在github連結恢復正常了。

已同步github

一、設計題目:距離向量路由選擇演算法的模擬實現

二、設計要求

(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,6 4=3 5=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();
    }


}

相關推薦

rip協議java模擬實現

大二下學期的計算機網路原理課程設計 之前整理了github,換了地址,忘了更新了,感謝評論提醒,現在github連結恢復正常了。 已同步github 一、設計題目:距離向量路由選擇演算法的模擬實現 二、設計要求 (1)掌握距

websocket通信 實現java模擬一個client與webclient通信

split 指定 erro nec pan substr use serve star 環境: tomcat 7 maven項目 IDE是IDEA2017 項目功能描述: 啟動項目,會啟動一個web端的websocket-client和一個java模擬的webso

動態路由實現OSPF和RIP協議實現全網互連互通

靜態 nom 匯總 red nag 過程 mat dia 工作 動態路由: 是指路由器能夠自動地建立自己的路由表,並且能夠根據實際情況的變化適時地進行調整。 原理: 動態路由機制的運作依賴路由器的兩個基本功能:路由器之間適時的路由信息交換,對路由表的維護: 路由器之間適時地

Java Socket 實現HTTP與HTTPS協議傳送POST/GET請求

JAVA Socket 實現HTTP與HTTPS客戶端傳送POST與GET方式請求         哇,一看標題怎麼這麼長啊,其實意思很簡單,哥討厭用HTTP Client做POST與GET提交覺得那個畢竟是別人寫得AP

python3.6環境下利用TCP傳輸控制協議模擬實現的端對端的聊天功能

服務端原始碼 """ TCP完整版聊天室端對端開發(服務端) version 1.1.0 author lkk Email [email protected] """ # 引入所需模組

Java模擬ReentrantLock實現自己的顯示鎖BooleanLock

一、前言 Java通過synchronized關鍵字來為我們提供執行緒安全的保證,大多數情況下使用synchronized是沒有問題的,然而synchronized有自身的缺陷。例如:當其它執行緒持有鎖時,當前請求獲取鎖的執行緒必須等待。等待的時長是無法控制的,而且等待過程

檔案系統模擬實現java

作業系統課程設計的內容: 編寫程式模擬一個簡單的檔案系統,具體實驗內容如下: (1)實現多級目錄結構,而非二級目錄結構。 (2)實現檔案和目錄的建立、刪除、重新命名和讀寫許可權控制功能。 (3)實現顯示檔案內容和更改檔案內容的功能。 (4)建立檔案或目錄時,採用動態申請的方式

Java內部類模擬實現多繼承

package com.test; /**  *  橡皮類  * */public abstract class Eraser {             public abstract void erase(); } package com.test;/**  *  鉛筆

HTTP協議簡介詳解 HTTP協議發展 原理 請求方法 響應狀態碼 請求頭 請求首部 java模擬瀏覽器客戶端服務端

協議簡介 協議,自然語言裡面就是契約,也是雙方或者多方經過協商達成的一致意見; 契約也即類似於合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通訊協議,也即是雙方通過網路通訊必須遵從的一組約定; 計算機網路的本質在於傳遞資料,協議自然是針對於資料的結構格式以及傳送規則的約定;

java用陣列模擬實現ArrayList以及一些常用方法實現

package com.yys.student; /** * Created by yys on 2017/5/4. */ public class SxtArrayList { private Object[] elementDate; private

模擬JDK動態代理 ; 自己動手模擬實現java動態代理

大家在看java設計模式之 代理模式這篇文章的時候, 可以發現動態代理無非就是以下四個步驟,我們完全可以自己模擬實現。因為java的class檔案格式是公開的,只要最終生成的class格式正確並且可以載入到JVM中我們就可以正常使用啦。 1. 建立代

java模擬表單上傳檔案,java通過模擬post方式提交表單實現圖片上傳功能例項

package com.zdz.httpclient;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.

使用Java Socket模擬實現聊天室

        使用Java Socket模擬實現了一個聊天室,實現了基本的私聊以及群聊。分為伺服器端和客戶端,下面我來介紹一下實現的步驟。伺服器端        伺服器端是聊天室的核心所在,主要用來處理客戶端的請求,先來看一下伺服器端的主方法: public stat

java模擬post方式提交表單實現圖片上傳

模擬表單html如下: <form action="up_result.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1">       <label>

Java 模擬 HTTP Get Post 請求實現論壇自動回帖

設計思路 最近想自動發帖回帖,拿某論壇試驗了一下,發現可行,不過後續沒有再使用,免得影響論壇正常執行。 帖子連結的格式為 http://bbs.***.***.**/forum.php?mod=viewthread&tid=774210

Web驗證碼圖片的生成-基於Java實現

submit esc page resp ioe 代碼 oge cnblogs pro 驗證碼圖片是由程序動態產生的,每次訪問的內容都是隨機的。那麽如何采用程序動態產生圖片,並能夠顯示在客戶端頁面中呢?原理很簡單,對於java而言,我們首先開發一個Servlet,這個Se

Java實現String.padLeft和String.padRight

toc 還要 color for 失去 1-1 arraycopy ace pre 因為習慣了C#中的padLeft和padRight,接觸Java後突然失去這兩個功能,覺得別扭,就試著實現了這兩個方法。 Java中String.format()中帶有字符串對齊功能如下

python基礎作業------模擬實現一個ATM + 購物商城程序

setting water 轉賬 atm 結算 pan auth hide use 模擬實現一個ATM + 購物商城程序 作業需求: 額度 15000或自定義 實現購物商城,買東西加入 購物車,調用信用卡接口結賬 可以提現,手續費5% 每月22號出賬單,每月10號為還款日

JAVA模擬登錄實例

exceptio sig fire client 請求 其它 log new mono 近期在做公司一個web項目。要求在我們的系統上,可以顯示其它站點上的數據。 剛開始接到這個任務時,還在想。簡單的非常。直接用UrlConection直接進入該網頁,然後獲取該網

java語言實現

span 前序 java語言 wot root 存儲 public == class 首先用Node類定義一個節點,用來存儲每個節點的內容: public class Node { // 關鍵字 private int keyData;