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;