广州大学 计算机网络实验5 网络程序设计 写一个程序来模拟网桥功能 2020.12

本文主要是介绍广州大学 计算机网络实验5 网络程序设计 写一个程序来模拟网桥功能 2020.12,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、网桥的定义

网桥是一个局域网与另一个局域网之间建立连接的桥梁。属于数据链路层的一种设备。

网桥的作业是拓展网络和通信手段,在各种传输介质中发送数据信号,拓展网络的距离,同时又有选择地将现有地址的信号从一个传输介质发送到另一个传输介质,并能有效抵限制两个介质系统中无关紧要的通信。

网桥可分为本地网桥和远程网桥。本地网桥指在传输介质允许长度范围内互联网络的网桥,远程网桥是指连接的距离超过网络的常规范围时使用的远程桥,通过远程桥互联的局域网将成为广域网,如果使用远程网桥,远程桥必须成对出现。

目前流行的网桥实现:交换机。

2、写一个程序来模拟网桥功能

模拟实现网桥的转发功能,以从文件中读取帧模拟网桥从网络中收到一帧,即从两个文件中读入一系列帧,从第一个文件中读入一帧然后从第二个文件中再读入一帧,如此下去。对每一帧,显示网桥是否会转发,及显示转发表内容。

在这里插入图片描述
换一个图:

在这里插入图片描述

我的方式

我们简化帧和交换表的格式,用txt来模拟帧和转发表。

帧的格式:

【源地址】 【目的地址】 【帧数据】

我们用a-z 26个字母来表示不同的地址。
在现实中,帧数据应该是一些二进制串,在这个实验中,重点不在这些二进制串,我们用data字符串来表示。

在这里插入图片描述

交换表的格式:

【地址】 【网段】 【记录时间】

我们用A、B、C这 26个大写字母来表示不同的网段。

因为交换表一开始是可以为空的,可以通过自学习功能来慢慢补全,补的时候就会记录下时间。

在这里插入图片描述

程序运行逻辑:

在这里插入图片描述

实验文件夹:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验结果

在这里插入图片描述
在这里插入图片描述

通过自学习之后的交换表:

在这里插入图片描述

代码:

此代码比较啰嗦。。并且为了让代码看起来想多公整,没有考虑字符流的异常抛出,关闭流等问题,有可能会有问题。

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class Bridege {//从一开始就设定网段A,B有多少台主机public static String[] pcSegA = new String[]{"a","b","c"};public static String[] pcSegB = new String[]{"l","j","k"};//文件读取public static BufferedReader readTxt(String fileName) throws Exception {//创建字符流FileReader fr = new FileReader(fileName);BufferedReader br = new BufferedReader(fr);return br;}//转发算法public static void transfer(String flag,String curLine,Map addrToSegMap,PrintWriter pw){//1、获取源地址和目的地址String[] conment = curLine.split(" ");String src = conment[0];String dst = conment[1];System.out.println("源地址:"+src);System.out.println("目的地址:"+dst);//2、交换表记录源地址SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(new Date());addrToSegMap.put(src,flag);//写入到交换表之中pw.println(src+" "+flag+" "+time);//3、在交换表中找目的地址if(addrToSegMap.containsKey(dst)){System.out.println("交换表中找到接受网段"+dst+",进行转发");}else{System.out.println("交换表中没有找到接受网段"+dst+",进行广播");if(boardcast(flag,dst)){System.out.println("广播中找到接受网段"+dst+",进行转发");}else{System.out.println("广播未找到接受网段"+dst+",丢弃此帧");}}}public static boolean boardcast(String flag,String dst){if(flag.equals("A")){//找B网段for (int i = 0; i < pcSegB.length; i++) {if( dst.equals(pcSegB[i]) ){return true;}}}else{//找A网段for (int i = 0; i < pcSegA.length; i++) {if( dst.equals(pcSegA[i]) ){return true;}}}return false;}public static void main(String[] args) throws Exception{//1、程序读入网段A,网段B,交换表BufferedReader brA = readTxt("src/segmentA.txt");BufferedReader brB = readTxt("src/segmentB.txt");BufferedReader brSwap = readTxt("src/swaptable.txt");System.out.println("开始读入交换表数据··········");//2、把交换表中 地址——》网段 映射写在一个哈希表上Map<String,String> addrToSegMap= new HashMap<>();//第一行是标题不读brA.readLine();brB.readLine();brSwap.readLine();String flag = "A";//当网段的帧已经全部读完.则置为trueboolean segaIsReaded = false;boolean segbIsReaded = false;//读取交换表内容while(true){String curLine = brSwap.readLine();//读到文件末尾if(curLine == null){break;}//以空格为分隔符,分别是 地址,网段,时间String[] conment = curLine.split(" ");System.out.println(conment[0]+" "+conment[1]+" "+conment[2]);//添加进入哈希表addrToSegMap.put(conment[0],conment[1]);}//已经不用再读取交换表了brSwap.close();System.out.println("交换表数据读入完毕··········");//设置为追加写入模式FileWriter fw = new FileWriter("src/swaptable.txt",true);PrintWriter pw = new PrintWriter(fw);System.out.println("开始读入网段帧数据··········");System.out.println("=============================================");//开始读入A,B网段的内容while(true){//两个网段的内容都读完,跳出。if(segaIsReaded && segbIsReaded){break;}if(!segaIsReaded && flag.equals("A")){String curLine = brA.readLine();//网段A读完if(curLine == null){segaIsReaded = true;//下一次读网段Bflag = "B";continue;}//网段A未读完System.out.println("收到网段"+flag+"的一个帧数据,开始转发··········");transfer(flag,curLine,addrToSegMap,pw);System.out.println("=============================================");flag = "B";continue;}//防止跳出之后flag = "B";if(!segbIsReaded && flag == "B"){String curLine = brB.readLine();//网段B读完if(curLine == null){segbIsReaded = true;//下一次读网段Aflag = "A";continue;}//网段B未读完System.out.println("收到网段"+flag+"的一个帧数据,开始转发··········");transfer(flag,curLine,addrToSegMap,pw);System.out.println("=============================================");flag = "A";continue;}//防止跳出之后flag = "A";}System.out.println("全部网段帧数据读入完毕··········");//关闭流brA.close();brB.close();fw.flush();pw.close();fw.close();System.out.println("程序结束");}
}

这篇关于广州大学 计算机网络实验5 网络程序设计 写一个程序来模拟网桥功能 2020.12的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413526

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Java实现TXT文件导入功能的详细步骤

《Java实现TXT文件导入功能的详细步骤》在实际开发中,很多应用场景需要将用户上传的TXT文件进行解析,并将文件中的数据导入到数据库或其他存储系统中,本文将演示如何用Java实现一个基本的TXT文件... 目录前言1. 项目需求分析2. 示例文件格式3. 实现步骤3.1. 准备数据库(假设使用 mysql

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制