From 810d5954b8860d0476303b8c627a00ad629bca1e Mon Sep 17 00:00:00 2001 From: carry <2641257231@qq.com> Date: Mon, 10 Jul 2023 13:42:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++ fit.carry.bridge/src/Bridge.java | 60 +++++++++++++++++ fit.carry.bridge/src/ForwardTable.java | 3 + fit.carry.bridge/src/Frame.java | 43 ++++++++++++ fit.carry.bridge/src/Host.java | 53 +++++++++++++++ fit.carry.bridge/src/Main.java | 90 ++++++++++++++++++++++++++ fit.carry.bridge/src/map.java | 25 +++++++ frame1.txt | 3 + frame2.txt | 3 + 9 files changed, 284 insertions(+) create mode 100644 .gitignore create mode 100644 fit.carry.bridge/src/Bridge.java create mode 100644 fit.carry.bridge/src/ForwardTable.java create mode 100644 fit.carry.bridge/src/Frame.java create mode 100644 fit.carry.bridge/src/Host.java create mode 100644 fit.carry.bridge/src/Main.java create mode 100644 fit.carry.bridge/src/map.java create mode 100644 frame1.txt create mode 100644 frame2.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3a93c54 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea +out +fit.carry.bridge/fit.carry.bridge.iml +bridge.iml \ No newline at end of file diff --git a/fit.carry.bridge/src/Bridge.java b/fit.carry.bridge/src/Bridge.java new file mode 100644 index 0000000..fbee431 --- /dev/null +++ b/fit.carry.bridge/src/Bridge.java @@ -0,0 +1,60 @@ +import java.util.ArrayList; +import java.util.HashMap; + +import static java.lang.Thread.sleep; + +public class Bridge implements Runnable{ + + private HashMap> forwardTable; + private ArrayList> subNetList; + + public Bridge(ArrayList> subNetList, ArrayList postList) { + this.subNetList = subNetList; + this.postList = postList; + forwardTable = new HashMap<>(); + } + + private ArrayList postList; + + + @Override + public void run() { + try { + ArrayList target = null; + Frame seeker = null; + for (Frame toPost : postList) { + target = forwardTable.get(toPost.getDes()); + if (null != target) { + System.out.println("找到"+toPost.getDes()+"的网段,已发送"); + target.add(toPost); + } else { + seeker = new Frame(0, toPost.getDes(), "SEEK"); + for (ArrayList subNet : subNetList) { + synchronized (subNet) { + subNet.add(seeker); + } + } + sleep(5); + out: + for (ArrayList subNet : subNetList) { + synchronized (subNet) { + for (Frame frame : subNet) { + if (frame.getDes() == 0) { + forwardTable.put(toPost.getDes(), subNet); + System.out.println("已找到" + toPost.getDes() + "的网段,已记入转发表"); + subNet.add(toPost); + subNet.remove(frame); + break out; + } + } + } + } + } + + } + } + catch (Exception e){ + } + } + +} diff --git a/fit.carry.bridge/src/ForwardTable.java b/fit.carry.bridge/src/ForwardTable.java new file mode 100644 index 0000000..cf8d596 --- /dev/null +++ b/fit.carry.bridge/src/ForwardTable.java @@ -0,0 +1,3 @@ +public class ForwardTable { + +} diff --git a/fit.carry.bridge/src/Frame.java b/fit.carry.bridge/src/Frame.java new file mode 100644 index 0000000..6c19f77 --- /dev/null +++ b/fit.carry.bridge/src/Frame.java @@ -0,0 +1,43 @@ +public class Frame { + private int src; + private int des; + + public int getRtt() { + return rtt; + } + + private int rtt; + private String data; + public int getSrc() { + return src; + } + + public void setSrc(int src) { + this.src = src; + } + + public int getDes() { + return des; + } + + public void setDes(int des) { + this.des = des; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + public Frame(){ + + } + public Frame(int src, int des, String data) { + this.src = src; + this.des = des; + this.data = data; + this.rtt = 0; + } +} diff --git a/fit.carry.bridge/src/Host.java b/fit.carry.bridge/src/Host.java new file mode 100644 index 0000000..7ed3ad7 --- /dev/null +++ b/fit.carry.bridge/src/Host.java @@ -0,0 +1,53 @@ +import java.util.ArrayList; + +import static java.lang.Thread.sleep; + +public class Host implements Runnable { + public Host(int addr, ArrayList subNet) { + this.addr = addr; + this.subNet = subNet; + } + @Override + public void run() { + while(true){ + try { + synchronized (subNet){ + if(subNet.size() != 0) { + for (Frame each : subNet) { + if (each.getDes() == this.addr) { + System.out.println("主机" + addr + "收到:" + each.getData()); + if(each.getData().equals("SEEK")){ + subNet.add(new Frame(addr,0,"REPLY")); + System.out.println("网桥广播查找,以向网桥汇报"); + } + subNet.remove(each); + } + } + } + } + sleep(1); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + public int getAddr() { + return addr; + } + + public void setAddr(int addr) { + this.addr = addr; + } + + public ArrayList getSubNet() { + return subNet; + } + + public void setSubNet(ArrayList subNet) { + this.subNet = subNet; + } + + private int addr; + private ArrayList subNet; + +} diff --git a/fit.carry.bridge/src/Main.java b/fit.carry.bridge/src/Main.java new file mode 100644 index 0000000..6cc387b --- /dev/null +++ b/fit.carry.bridge/src/Main.java @@ -0,0 +1,90 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.Arrays; + +public class Main { + public static ArrayList readFrame(String fileName1,String fileName2){ + ArrayList frameList = new ArrayList<>(); + ArrayList frameList1 = new ArrayList<>(); + ArrayList frameList2 = new ArrayList<>(); + + // 读取文件中的数据 + try (BufferedReader br = new BufferedReader(new FileReader(fileName1))) { + String line; + while ((line = br.readLine()) != null) { + String[] tokens = line.split(" "); + int src = Integer.parseInt(tokens[0]); + int des = Integer.parseInt(tokens[1]); + String data = tokens[2]; + frameList1.add(new Frame(src, des, data)); // 将读取的数据存入列表中 + } + } catch (IOException e) { + e.printStackTrace(); + } + + // 读取文件中的数据 + try (BufferedReader br = new BufferedReader(new FileReader(fileName2))) { + String line; + while ((line = br.readLine()) != null) { + String[] tokens = line.split(" "); + int src = Integer.parseInt(tokens[0]); + int des = Integer.parseInt(tokens[1]); + String data = tokens[2]; + frameList2.add(new Frame(src, des, data)); // 将读取的数据存入列表中 + } + } catch (IOException e) { + e.printStackTrace(); + } + + int i = 0; + int j = 0; + while (i < frameList1.size() && j < frameList2.size()) { + frameList.add(frameList1.get(i)); + frameList.add(frameList2.get(j)); + i++; + j++; + } + + // 将list1或list2中可能剩余的元素加入到interleavedList中 + while (i < frameList1.size()) { + frameList.add(frameList1.get(i)); + i++; + } + while (j < frameList2.size()) { + frameList.add(frameList2.get(j)); + j++; + } + + return frameList; + } + public static void main(String[] args){ + ArrayList frameList = readFrame("frame1.txt","frame2.txt"); + + ArrayList subNet1 = new ArrayList<>(); + ArrayList subNet2 = new ArrayList<>(); + + ArrayList> subNetList = new ArrayList<>(Arrays.asList(subNet1,subNet2)); + + Thread host = null; + ArrayList hostList = new ArrayList<>(); + + for(int i = 1;i <= 3; i++){ + host = new Thread(new Host(i,subNet1)); + host.setDaemon(true); + hostList.add(host); + } + for(int i = 4;i <=6; i++){ + host = new Thread(new Host(i,subNet2)); + host.setDaemon(true); + hostList.add(host); + } + + for(Thread each : hostList){ + each.start(); + } + + Thread bridge = new Thread(new Bridge(subNetList,frameList)); + bridge.start(); + + } +} \ No newline at end of file diff --git a/fit.carry.bridge/src/map.java b/fit.carry.bridge/src/map.java new file mode 100644 index 0000000..e976e70 --- /dev/null +++ b/fit.carry.bridge/src/map.java @@ -0,0 +1,25 @@ +import java.util.ArrayList; + +public class map{ + private int addr; + private ArrayList net; + public map(int addr, ArrayList net) { + this.addr = addr; + this.net = net; + } + public int getAddr() { + return addr; + } + + public void setAddr(int addr) { + this.addr = addr; + } + + public ArrayList getNet() { + return net; + } + + public void setNet(ArrayList net) { + this.net = net; + } +} \ No newline at end of file diff --git a/frame1.txt b/frame1.txt new file mode 100644 index 0000000..cdc858f --- /dev/null +++ b/frame1.txt @@ -0,0 +1,3 @@ +2 6 asd +1 6 fdasf +3 4 asdf \ No newline at end of file diff --git a/frame2.txt b/frame2.txt new file mode 100644 index 0000000..9ee2e82 --- /dev/null +++ b/frame2.txt @@ -0,0 +1,3 @@ +5 2 jsadf +5 1 sadf +4 3 sda \ No newline at end of file