java模擬網橋功能

在這裏插入圖片描述

1.host主機類

package FirstExpriment;

import java.util.HashMap;
import java.util.Map;

/**
*   模擬主機功能
 *   屬性:端口號,物理地址
 *   函數作用:協助交換表的廣播的查詢、增加記錄等
 */
public class Host {
    private String port;
    private String mac;

    // 交換機使用的交換表,以目的地址mac爲key,以端口地址port+時間date的數組爲value
    public static Map<String,String>hostMap =new HashMap<>();

    public Host(String  mac,String port){
        this.port =port;
        this.mac =mac;
        hostMap.put(mac,port);
    }

    /*  轉發幀:
        查找交換表中與收到幀的目的地址有無相匹配的項目。
        如沒有,則向所有其他接口(進入的接口除外)轉發。
        如有,則按交換表中給出的接口進行轉發。
        若交換表中給出的接口就是該幀進入交換機的接口,則應丟棄這個幀(因爲這時不需要經過交換機進行轉發)。
     */
    public static void receiveBroadcast(String src,String dest){
        if(src==null||dest==null)  return;    //判空
        for(Map.Entry<String ,String> entry : hostMap.entrySet()){
            String curMac = entry.getKey();
            String curPort = entry.getValue();//當前端口
            //若交換表中給出的接口就是該幀進入交換機的接口,則應丟棄這個幀,該幀不對該地址廣播源地址
            if(src.equals( curMac)  )  continue;
            //如果目的地址相同,收下該幀
            if(dest.equals(curMac)){
                System.out.println("地址"+curMac+"通過"+curPort+"接口收下了該幀");
            }else{
               System.out.println(curPort+"接口丟棄了該幀" ) ;
            }
        }
    }
}

2、交換機類

package FirstExpriment;

import java.util.HashMap;
import java.util.Map;
import java.text.SimpleDateFormat;

/**
 * 交換表作用
 */
public class exchangeMachine {
    private Map<String ,String[]>exchangeTable =null;
    public exchangeMachine(){
        exchangeTable =new HashMap();
    }
    //傳輸幀
    public void transferFrame(String frame){
        String segment[];
        segment = frame.split(" ");
        //frame 格式:  destMac srcMac information
        String destMac = segment[0];
        String srcMac = segment[1];
 // 這裏註釋的是,模擬黑客通過接口竊取用戶信息
//        String information="";
//        for(int i=3;i<segment.length-1;i++){
//            information += segment[i];
//        }
        boolean isSrcExit =false;
        boolean isDestExit =false;
        //查找交換表
        for(Map.Entry<String ,String[]> entry:exchangeTable.entrySet()){
            String curMac =entry.getKey();
            if(srcMac.equals(curMac)){
                isSrcExit=true;//源地址存在
            }
            if(destMac.equals(curMac)){
                isDestExit =true;//目的地址存在
            }
            if(isDestExit && isSrcExit)  //源地址和目的地址都在交換表中存在
                break;
        }
        // 源地址不在交換表中,需要加入交換表
        // 源地址在交換表中,則需要更新交換表中對應的進入接口和有效時間
        addAndUpdateExchangeTable(srcMac,isSrcExit) ;
        if(isDestExit)//目的地址存在
            System.out.println("查找到目的地址"+destMac+",直接轉發信息");
        else//目的地址不存在表,需要廣播
            Host.receiveBroadcast(srcMac,destMac);
    }
    private void addAndUpdateExchangeTable(String srcMac,boolean isSrcExit){
        for(Map.Entry<String ,String>entry: Host.hostMap.entrySet() ){
            String curMac = entry.getKey();
            String curPort = entry.getValue();//當前端口
            if(srcMac.equals(curMac)){
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
                String date = df.format(System.currentTimeMillis());
                exchangeTable.put(curMac,new String[]{curPort,date});
                if(!isSrcExit)
                    System.out.println("源目的Mac地址爲"+srcMac +",通過"+curPort+"端口"+"加入了交換表中,加入的有效時間爲"+date);
                else
                    System.out.println("源目的Mac地址爲"+srcMac +",通過"+curPort+"端口"+"加入了交換表中,更新加入的有效時間爲"+date);
                break;
            }
        }
    }



}

3、網橋類

package FirstExpriment;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 讀取的文件是按行讀取,且每一行的格式必須是
 * 目的地址(6字節) 源地址(6字節)  類型(2字節)    IP數據報(46-1500字節)    fcs(4字節)
 * 畢竟是模擬,所以只是按照格式,忽略真實字節數
 * destinaionMac sourceMac     0x0800       content                 FCS
 */
public class netBridge {
   public final static String inFilePath1 ="C:\\Users\\Lenovo\\Desktop\\1.txt";
   public final static String inFilePath2 ="C:\\Users\\Lenovo\\Desktop\\2.txt";
   public static void main(String args[]) throws IOException {
       BufferedReader reader1=null;
       BufferedReader reader2= null;
       //需要聲明幾臺主機,確定實驗環境,文件中目的地址和源地址只有在這幾個的範圍內纔可以,(按序生成端口號和mac地址,考慮100個內)
       Host hosts[]=new Host[4];
       //初始化主機
       initHosts(hosts);
       exchangeMachine table =new exchangeMachine();
       try {
           reader1 = new BufferedReader(new InputStreamReader(new FileInputStream(inFilePath1), "UTF-8"));
           reader2 = new BufferedReader(new InputStreamReader(new FileInputStream(inFilePath2), "UTF-8"));
           String frame;
           while (true) {
               if ((frame = reader1.readLine()) != null && !frame.equals("") )
                   tableTransferFrame(table,frame);
               else {
                   while ((frame = reader2.readLine()) != null && !frame.equals(""))
                       tableTransferFrame(table,frame);
                   break;
               }
               if ((frame = reader2.readLine()) != null && !frame.equals(""))
                   tableTransferFrame(table,frame);
                else {
                   while ((frame = reader1.readLine()) != null && !frame.equals(""))
                       tableTransferFrame(table,frame);
                   break;
               }
           }
       }
       catch(Exception e){
           e.printStackTrace();
       }
       finally{
           reader1.close();
           reader2.close();
       }
   }

   public static void initHosts(Host hosts[]){
       int length=hosts.length;
       //主機的MAC地址
       String hostName[] =new String[length];
       //主機的端口號
       String portName[]=new String[length];
       for(int t=0;t<length;t++){
           if(t<10) {
               hostName[t] = "E8-2A-44-E8-E5-0" + t;
               portName[t] = "000"+t;
           }else{
               hostName[t]  = "E8-2A-44-E8-E5-"+t;
               portName[t] = "00"+t;
           }
           //初始化每臺主機
           hosts[t]=new Host(hostName[t],portName[t]);
       }

   }
   private static void tableTransferFrame(exchangeMachine table, String frame){
       table.transferFrame(frame);
       System.out.println();
   }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章