代码
This commit is contained in:
commit
810d5954b8
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.idea
|
||||||
|
out
|
||||||
|
fit.carry.bridge/fit.carry.bridge.iml
|
||||||
|
bridge.iml
|
60
fit.carry.bridge/src/Bridge.java
Normal file
60
fit.carry.bridge/src/Bridge.java
Normal file
@ -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<Integer,ArrayList<Frame>> forwardTable;
|
||||||
|
private ArrayList<ArrayList<Frame>> subNetList;
|
||||||
|
|
||||||
|
public Bridge(ArrayList<ArrayList<Frame>> subNetList, ArrayList<Frame> postList) {
|
||||||
|
this.subNetList = subNetList;
|
||||||
|
this.postList = postList;
|
||||||
|
forwardTable = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<Frame> postList;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
ArrayList<Frame> 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<Frame> subNet : subNetList) {
|
||||||
|
synchronized (subNet) {
|
||||||
|
subNet.add(seeker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleep(5);
|
||||||
|
out:
|
||||||
|
for (ArrayList<Frame> 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){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
3
fit.carry.bridge/src/ForwardTable.java
Normal file
3
fit.carry.bridge/src/ForwardTable.java
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
public class ForwardTable {
|
||||||
|
|
||||||
|
}
|
43
fit.carry.bridge/src/Frame.java
Normal file
43
fit.carry.bridge/src/Frame.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
53
fit.carry.bridge/src/Host.java
Normal file
53
fit.carry.bridge/src/Host.java
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import static java.lang.Thread.sleep;
|
||||||
|
|
||||||
|
public class Host implements Runnable {
|
||||||
|
public Host(int addr, ArrayList<Frame> 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<Frame> getSubNet() {
|
||||||
|
return subNet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubNet(ArrayList<Frame> subNet) {
|
||||||
|
this.subNet = subNet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int addr;
|
||||||
|
private ArrayList<Frame> subNet;
|
||||||
|
|
||||||
|
}
|
90
fit.carry.bridge/src/Main.java
Normal file
90
fit.carry.bridge/src/Main.java
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import java.io.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static ArrayList<Frame> readFrame(String fileName1,String fileName2){
|
||||||
|
ArrayList<Frame> frameList = new ArrayList<>();
|
||||||
|
ArrayList<Frame> frameList1 = new ArrayList<>();
|
||||||
|
ArrayList<Frame> 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<Frame> frameList = readFrame("frame1.txt","frame2.txt");
|
||||||
|
|
||||||
|
ArrayList<Frame> subNet1 = new ArrayList<>();
|
||||||
|
ArrayList<Frame> subNet2 = new ArrayList<>();
|
||||||
|
|
||||||
|
ArrayList<ArrayList<Frame>> subNetList = new ArrayList<>(Arrays.asList(subNet1,subNet2));
|
||||||
|
|
||||||
|
Thread host = null;
|
||||||
|
ArrayList<Thread> 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();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
25
fit.carry.bridge/src/map.java
Normal file
25
fit.carry.bridge/src/map.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class map{
|
||||||
|
private int addr;
|
||||||
|
private ArrayList<Frame> net;
|
||||||
|
public map(int addr, ArrayList<Frame> net) {
|
||||||
|
this.addr = addr;
|
||||||
|
this.net = net;
|
||||||
|
}
|
||||||
|
public int getAddr() {
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddr(int addr) {
|
||||||
|
this.addr = addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Frame> getNet() {
|
||||||
|
return net;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNet(ArrayList<Frame> net) {
|
||||||
|
this.net = net;
|
||||||
|
}
|
||||||
|
}
|
3
frame1.txt
Normal file
3
frame1.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
2 6 asd
|
||||||
|
1 6 fdasf
|
||||||
|
3 4 asdf
|
3
frame2.txt
Normal file
3
frame2.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
5 2 jsadf
|
||||||
|
5 1 sadf
|
||||||
|
4 3 sda
|
Loading…
Reference in New Issue
Block a user