Java模拟路由协议-rip(路由器仿真实验)

前言:

      好久不见,有段时间没有写文章了,本篇文章,由Blue我带大家来复现rip协议。我们以

b站湖南教师匠所讲rip的视频中的例子为我这篇文章所模拟的路由路径

如图:

模拟路径

视频:http://【深入浅出计算机网络 - 4.4.3 路由信息协议RIP】https://www.bilibili.com/video/BV1ST411K7nK?vd_source=bb412cc25ca27e171f8e17085daad038

 Rip协议工作原理:

  • 1、rip协议要求网络中每个路由器都要维护从它自己到其他每一个目的网络的距离记录。
  • 2、rip认为好的路由就是它通过的网路数目少的,及“距离最短”。
  • 3、rip最多允许一条路径包括15个网络。距离为16时相当于不可达。
  • 4、仅和相邻路由器交换信息,这里的信息指的是所有网络的最短距离,以及到每个网络应经过的下一跳路由
  • 5、按固定时间间隔交换路由信息

 代码实现:

第一步:搭建项目

注意:我搭建的是boot项目,实际我这个复现,并没使用boot,所以你也可以不搭建boot

 项目结构:

第二步:定义路由表中的关键列(目的网络,距离,下一跳)

RouterTable:

package com.example.Kclass;/*** 路由表:* 1、目的网络* 2、距离* 3、下一跳路由器*/
public class RouterTable implements Cloneable{private Integer AimNet;private Integer distance;private String NextRouter;public RouterTable() {}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public RouterTable(Integer AimNet, Integer distance, String NextRouter) {this.AimNet = AimNet;this.distance = distance;this.NextRouter = NextRouter;}/*** 获取* @return AimNet*/public Integer getAimNet() {return AimNet;}/*** 设置* @param AimNet*/public void setAimNet(Integer AimNet) {this.AimNet = AimNet;}/*** 获取* @return distance*/public Integer getDistance() {return distance;}/*** 设置* @param distance*/public void setDistance(Integer distance) {this.distance = distance;}/*** 获取* @return NextRouter*/public String getNextRouter() {return NextRouter;}/*** 设置* @param NextRouter*/public void setNextRouter(String NextRouter) {this.NextRouter = NextRouter;}public String toString() {return "RouterTable{AimNet = " + AimNet + ", distance = " + distance + ", NextRouter = " + NextRouter + "}";}
}

第三步:定义路由器 

 Router:

package com.example.Kclass;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;/*** 路由器的模板类**/
public class Router {private int id;List<RouterTable> routerTables = new ArrayList<>();public void setId(int id) {this.id = id;}public int getId() {return id;}public String find(int aimid){String sc ="完成";for (RouterTable e : routerTables){if(e.getAimNet()==aimid){System.out.println("需要经过的路由器:"+this.id);System.out.println("");if(e.getNextRouter().equals("直连")){return sc;}else {return e.getNextRouter();}}}return sc;}//添加操作public  void add(RouterTable routerTable){int count=0;//存在相同的目的网络则不添加for (RouterTable e1  : routerTables){if(e1.getAimNet().equals(routerTable.getAimNet())){//不添加return;}}routerTables.add(routerTable);}//更新操作public void update(List<RouterTable> r1){/*** 遍历,看这个路由表满足这几种可能不?* 1、没有就插入* 2、有,如果下一跳相同则直接更新* 3、有,下一跳不同,且r1的距离小于自身的,将下一跳换成r1的下一跳,并且更新* 4、有,下一跳不同,且r1的距离大于自身的,不管舍弃*///遍历for (int i=0;i<r1.size();i++){for (int j=0;j<routerTables.size();j++){//是否存在相同的目的网络if(r1.get(i).getAimNet().equals(routerTables.get(j).getAimNet())){//是否下一跳也相同if(r1.get(i).getNextRouter().equals(routerTables.get(j).getNextRouter())){//相同,直接更新routerTables.get(j).setDistance(r1.get(i).getDistance());break;}else {//不同,判断距离if(routerTables.get(j).getDistance()>r1.get(i).getDistance()){routerTables.get(j).setDistance(r1.get(i).getDistance());break;}else {break;}}}if(j==routerTables.size()-1){routerTables.add(r1.get(i));}}}}//打印其路由表public void prints(){System.out.println(id+"的路由表为:");System.out.println("---目的网络---距离-----下一跳路由-----");for(RouterTable e : routerTables){System.out.println("---"+e.getAimNet()+"-----"+e.getDistance()+"------"+e.getNextRouter());System.out.println("");}}public  List<RouterTable> deepCopyRouterTables() {List<RouterTable> copiedList = new ArrayList<>(routerTables.size());for (RouterTable routerTable : routerTables) {try {copiedList.add((RouterTable) routerTable.clone()); // 深拷贝} catch (CloneNotSupportedException e) {e.printStackTrace(); // 处理异常}}return copiedList;}
}

第四步:定义网络

NetWork:
package com.example.Kclass;public class NetWork {private int id;public NetWork() {}public NetWork(int id) {this.id = id;}/*** 获取* @return id*/public int getId() {return id;}/*** 设置* @param id*/public void setId(int id) {this.id = id;}public String toString() {return "NetWork{id = " + id + "}";}
}

第五步:定义User

package com.example.Kclass;public class User {private int id ;private int Routid;public User() {}public User(int id, int Routid) {this.id = id;this.Routid = Routid;}/*** 获取* @return id*/public int getId() {return id;}/*** 设置* @param id*/public void setId(int id) {this.id = id;}/*** 获取* @return Routid*/public int getRoutid() {return Routid;}/*** 设置* @param Routid*/public void setRoutid(int Routid) {this.Routid = Routid;}public String toString() {return "User{id = " + id + ", Routid = " + Routid + "}";}
}

第六步:Ts代码

package com.example.test;import com.example.Kclass.NetWork;
import com.example.Kclass.Router;
import com.example.Kclass.RouterTable;
import com.example.Kclass.User;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;/*** 1、四个网络* 2、四个路由器* 3、创建图(利用图来表示链接)* 4、该类目的是弄好路由器的交换表*/
public class Ts {public static void main(String[] args) {List<NetWork> netWorks =new ArrayList<>();List<Router> routers =new ArrayList<>();rip(netWorks,routers);//用户界面User user =new User(1,1);MainPannel(routers,user);}public static void ppt(List<Router> routers){for (Router e:routers){e.prints();}}public static void MainPannel(List<Router> routers,User user){while (true){int a;System.out.println("选项1:打印所有路由表");System.out.println("选项2:用户传输信息");System.out.println("选项3:退出");Scanner s =new Scanner(System.in);System.out.println("请输入选项:");a=s.nextInt();switch (a){case 1:ppt(routers);break;case 2:userprint(routers,user);break;case 3:return;}}}public static void userprint(List<Router> routers, User user){System.out.println("请输入需要传送到的网络");int a;Scanner sc = new Scanner(System.in);a=sc.nextInt();int t=a;//知道自己从那个路由出发int routid= user.getRoutid();Router router = routers.get(routid - 1);boolean flage =true;while (flage){String s = router.find(t);if(s.equals("完成")){System.out.println("完成");return;}a = Integer.parseInt(s);router=routers.get(a-1);}}public static void rip( List<NetWork> netWorks, List<Router> routers) {//生成四个网络//令四个网络为1,2,3,4for (int i=1;i<=4;i++){NetWork e =new NetWork();e.setId(i);netWorks.add(e);}//生成四个路由器//令四个路由器为5,6,7,8for (int i=5;i<=8;i++){Router e =new Router();e.setId(i-4);routers.add(e);}//生成线路int[][] arry=CreateImage();//rip基本原理规定:路由器刚开始工作只知道自己到直连网络的距离为1//根据线路初始化initialization(routers,arry);//打印初始化后的每个路由器的路由表
//        System.out.println("--------------------路由表的初始化-----------------------");
//        for (Router e:routers){
//            e.prints();
//        }//根据rip基本原理每个路由器仅和相邻路由器周期性地交换并更新路由信息find(routers,arry);
//        System.out.println("--------------------路由表的最终-----------------------");
//        for (Router e:routers){
//            e.prints();
//        }}public static int[][] CreateImage(){int[][] arry={{0,0,0,0,1,1,0,0},//N1所对应的行,0{0,0,0,0,1,0,1,0},//N2所对应的行,1{0,0,0,0,0,0,1,1},//N3所对应的行,2{0,0,0,0,0,1,1,1},//N4所对应的行,3{1,1,0,0,0,0,0,0},//R1所对应的行,4{1,0,0,1,0,0,0,0},//R2所对应的行,5{0,1,1,1,0,0,0,0},//R3所对应的行,6{0,0,1,1,0,0,0,0} //R4所对应的行,7};return arry;}//初始化public static void initialization(List<Router> routers,int[][] arry){for (int i=4;i<=7;i++){for (int j=0;j<4;j++){if(arry[i][j]==0){continue;}if(arry[i][j]==1){routers.get(i-4).add(new RouterTable(j+1,1,"直连"));}}}}//用于更新public static void exchenge(Router e1,Router e2){//先让e1去更新e2// 深拷贝List<RouterTable> Copye2 = e2.deepCopyRouterTables();String next=e2.getId()+"";//根据rip协议,让其距离加1,下一跳变为e1for (RouterTable table :Copye2){table.setDistance(table.getDistance()+1);table.setNextRouter(next);}e1.update(Copye2);//e2去更新e1String next2=e1.getId()+"";//深拷贝List<RouterTable> copy1 = e1.deepCopyRouterTables();//根据rip协议,让其距离加1,下一跳变为e2for (RouterTable table :copy1){table.setDistance(table.getDistance()+1);table.setNextRouter(next2);}e2.update(copy1);}//用于遍历数组,查找相同路由器public static void find(List<Router> routers,int[][] arry){//双指针遍历int A=0;int B=0;for (int i=0;i<4;i++){boolean flage=true;//优化操作if(flage) {for (int j = 4; j < 8; j++) {if (arry[i][j] == 1) {A = j;//找到第一个1,然后继续下去找B=j;flage=false;break;}}}for (int j=B+1;j<8;j++){if (arry[i][j]==1){//执行更新exchenge(routers.get(A-4),routers.get(j-4));//判断是否还有可能存在相邻if(j<7){int s=B;B=j;for (int w=B+1;w<8;w++){if(arry[i][w]==1){exchenge(routers.get(A-4),routers.get(w-4));exchenge(routers.get(s-4),routers.get(w-4));}else {break;}}}}}}}}

实现效果:

主页面:

选项1:

选项2:

选项3:

结语:

你好,我是Blue. 为帮助别人少走弯路而写博客 !!!

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

如果你遇到了问题,自己没法解决,可以私信问我。

感谢订阅专栏 三连文章!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

C语言内存之旅:从静态到动态的跨越

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…

AI时代:弯道超车的新思维与实践路径

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

【Spring】定义的Bean缺少隐式依赖

问题描述 初学 Spring 时&#xff0c;我们往往不能快速转化思维。例如&#xff0c;在程序开发过程中&#xff0c;有时候&#xff0c;一方面我们把一个类定义成 Bean&#xff0c;同时又觉得这个 Bean 的定义除了加了一些 Spring 注解外&#xff0c;并没有什么不同。所以在后续使…

『 实战项目 』Cloud Backup System - 云备份

文章目录 云备份项目服务端功能服务端功能模块划分客户端功能客户端模块划分 项目条件Jsoncpp第三方库Bundle第三方库httplib第三方库Request类Response类Server类Client类搭建简单服务器搭建简单客户端 服务端工具类实现 - 文件实用工具类服务器配置信息模块实现- 系统配置信息…

网络编程 | UDP组播通信

1、什么是组播 在上一篇博客中&#xff0c;对UDP的广播通信进行了由浅入深的总结梳理&#xff0c;本文继续对UDP的知识体系进行探讨&#xff0c;旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间&#xff0c;在一个局域网内&#xff0c;将某些主机添加到组中…

【无标题】微调是迁移学习吗?

是的&#xff0c;微调&#xff08;Fine-Tuning&#xff09;可以被视为一种迁移学习&#xff08;Transfer Learning&#xff09;的形式。迁移学习是一种机器学习方法&#xff0c;其核心思想是利用在一个任务上学到的知识来改进另一个相关任务的性能。微调正是通过在预训练模型的…

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块 在本篇文章中&#xff0c;我们将一步步走过如何创建一个简单的 HarmonyOS NAPI 模块。通过这个模块&#xff0c;你将能够更好地理解 NAPI 的工作原理&#xff0c;并在你的应用中开始使用 C 与 JavaScript 的…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

Python基于OpenCV和PyQt5的人脸识别上课签到系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

【FPGA】MIPS 12条整数指令【1】

目录 修改后的仿真结果 修改后的完整代码 实现bgtz、bltz、jalr 仿真结果&#xff08;有问题&#xff09; bltz------并未跳转&#xff0c;jCe&#xff1f; 原因是该条跳转语句判断的寄存器r7&#xff0c;在该时刻并未被赋值 代码&#xff08;InstMem修改前&#xff09; i…

Java面试专题——常见面试题1

引入 本文属于专题中的常见面试题模块&#xff0c;属于面试时经常遇到的&#xff0c;适合需要面试的小伙伴做面试前复习准备用&#xff0c;后续会持续补充 1.面向对象基本特征 面向对象的基本特征是什么&#xff1f;怎么理解&#xff1f; 面向对象的基本特征是封装、继承、…

VUE实现简单留言板(Timeline+infinite scroll+Springboot+Hibernate)

先贴出效果图&#xff1a; 留言按照倒序排列。在底部的文本框内输入留言后&#xff0c;点击“留言”按钮&#xff0c;留言将保存至数据库中&#xff0c;同时刷新网页&#xff0c;新留言出现在顶部。 当滚动条到底部时&#xff0c;自动调用加载函数&#xff0c;显示更多早期留…

Java基础(3)

Java 数据类型详解 九、运算符 1. 基本运算符 Java 提供了多种运算符来执行不同的操作&#xff1a; 算术运算符&#xff1a;&#xff08;加&#xff09;、-&#xff08;减&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;取模&…

电力场景红外测温图像绝缘套管分割数据集labelme格式2436张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;2436 标注数量(json文件个数)&#xff1a;2436 标注类别数&#xff1a;1 标注类别名称:["arrester"] 每个类别标注的框数&am…

降维算法:主成分分析

主成分分析 一种常用的数据分析技术&#xff0c;主要用于数据降维&#xff0c;在众多领域如统计学、机器学习、信号处理等都有广泛应用。 主成分分析是一种通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量&#xff08;即主成分&#xff09;的方法。这些主…