20175234 2018-2019-2 實驗五 網絡編程與安全

20175234 2018-2019-2 實驗五 網絡編程與安全

任務一

題目

  1. 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  2. 結對實現中綴表達式轉後綴表達式的功能 MyBC.java
  3. 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用MyDC.java

實驗內容:

1.熟悉棧的應用

Stack 類表示後進先出(LIFO)的對象堆棧。它經過五個操做對類 Vector 進行了擴展 ,容許將向量視爲堆棧。它提供了一般的 push 和 pop 操做,以及取堆棧頂點的 peek 方法、測試堆棧是否爲空的 empty 方法、在堆棧中查找項並肯定到堆棧頂距離的 search 方法。java

2.表達式的三種標識方法
  • OP + S1 + S2 爲前綴表示法
  • S1 + OP + S2 爲中綴表示法
  • S1 + S2 + OP 爲後綴表示法
3.MyDC

僞代碼git

  • 設置一個操做數棧,開始棧爲空;
  • 從左到右掃描後綴表達式,遇操做數,進棧;
  • 若遇運算符,則從棧中退出兩個元素,先退出的放到運算符的右邊,後退出的放到運算符左邊,運算後的結果再進棧,直到後綴表達式掃描完畢。此時,棧中僅有一個元素,即爲運算的結果。

代碼清單算法

import java.util.StringTokenizer;
import java.util.Stack;

public class MyDC {
    /**
     * constant for addition symbol
     */
    private final char ADD = '+';
    /**
     * constant for subtraction symbol
     */
    private final char SUBTRACT = '-';
    /**
     * constant for multiplication symbol
     */
    private final char MULTIPLY = '*';
    /**
     * constant for division symbol
     */
    private final char DIVIDE = '/';
    /**
     * the stackA
     */
    private Stack<Integer> stack;

    public MyDC() {
        stack = new Stack<Integer>();
    }

    public int evaluate(String expr) {
        int op1, op2, result = 0;
        String token;
        StringTokenizer tokenizer = new StringTokenizer(expr);

        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken();

            //若是是運算符,調用isOperator
            if (isOperator(token)) {
               op2=stack.pop();
                op1=stack.pop();
                result=evalSingleOp(token.charAt(0),op1,op2);
                       //根據運算符和兩個操做數調用evalSingleOp計算result;
                //計算result入棧;
                stack.push(result);
            } else {//若是是操做數
                stack.push(Integer.parseInt(token));//操做數入棧;
            }
        }

        return result;
    }

    private boolean isOperator(String token) {
        return (token.equals("+") || token.equals("-") ||
                token.equals("*") || token.equals("/"));
    }

    private int evalSingleOp(char operation, int op1, int op2) {
        int result = 0;

        switch (operation) {
            case ADD:
                result = op1 + op2;
                break;
            case SUBTRACT:
                result = op1 - op2;
                break;
            case MULTIPLY:
                result = op1 * op2;
                break;
            case DIVIDE:
                result = op1 / op2;
        }
        return result;
    }
}
4.MyBC

僞代碼express

  • 設立一個棧,存放運算符,首先棧爲空;
  • 從左到右掃描中綴式,若遇到操做數,直接輸出,並輸出一個空格做爲兩個操做數的分隔符;
  • 若遇到運算符,則與棧頂比較,比棧頂級別高則進棧,不然退出棧頂元素並輸出,而後輸出一個空格做分隔符;
  • 若遇到左括號,進棧;若遇到右括號,則一直退棧輸出,直到退到左括號止。
  • 當棧變成空時,輸出的結果即爲後綴表達式。

代碼清單編程

import java.util.*;
public class MyBC {
    public String result(String s) {
        Stack<String> sta = new Stack<String>();   //新建棧
        String str = "";
        StringTokenizer t=new StringTokenizer(s);
        while (t.hasMoreTokens()){    //依次遍歷元素,轉爲後綴表達式
            String temp;
            String c;
            c=t.nextToken();
            if (c.equals("+") || c.equals("-")) {   //遇到優先級最低的「+」、「-」,彈出「(」以前的全部元素
                while (sta.size() != 0) {
                    temp = sta.pop();
                    if (temp.equals("(")) {
                        sta.push("(");
                        break;
                    }
                    str = str + temp + " ";
                }
                sta.push(c);
            } else if (c.equals("*")|| c.equals("÷")) {   //遇到優先級高的「*」、「/」,彈出「(」以前的「*」、「/」
                while (sta.size() != 0) {
                    temp = sta.pop();
                    if (temp.equals("(") || temp.equals("+") || temp.equals("-")) {
                        sta.push(temp);
                        break;
                    } else
                        str = str + temp + " ";
                }
                sta.push(c);
            } else if (c.equals("(")) {     //遇到「(」直接入棧
                sta.push(c);
            } else if (c.equals(")")) {     //遇到「)」,彈出「(」以前的全部元素
                while (sta.size() != 0) {
                    temp = sta.pop();
                    if (temp.equals("("))
                        break;
                    else
                        str = str + temp + " ";
                }
            } else                       //遇到數字,直接存入數組
                str = str + c + " ";
        }
        while (sta.size()!=0){     //彈出棧中剩餘的元素
            str=str+sta.pop()+" ";
        }
        return str;
    }
}

測試代碼數組

import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        String s;
        int result;
        try {
            System.out.println("Enter a valid postfix expression: ");
            MyDC dc = new MyDC();
            MyBC bc = new MyBC();
            Scanner in = new Scanner(System.in);
            s = in.nextLine();
            s = bc.result(s);
            result = dc.evaluate(s);
            System.out.println("That expression equals : " + result);

        } catch (Exception IOException) {
            System.out.println("Input exception reported");
        }
    }
}
5.運行結果

任務二

題目

  1. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  2. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式經過網絡發送給服務器
  3. 服務器接收到後綴表達式,調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  4. 客戶端顯示服務器發送過來的結果

實驗內容

  1. TCP編程
      TCP協議是面向鏈接,可靠的,有序的,以字節流的方式發送數據。基於TCP協議實現網絡通訊的類有客戶端的Socket類和服務器端的ServerSocket類。
  2. 服務器端套路
    (1)建立ServerSocket對象,綁定監聽端口。
    (2)經過accept()方法監聽客戶端請求。
    (3)鏈接創建後,經過輸入流讀取客戶端發送的請求信息。
    (4)經過輸出流向客戶端發送響應信息。
    (5)關閉響應的資源。
  3. 客戶端套路
    (1)建立Socket對象,指明須要鏈接的服務器的地址和端口號。
    (2)鏈接創建後,經過輸出流向服務器發送請求信息。
    (3)經過輸入流獲取服務器響應的信息。
    (4)關閉相應資源。

2.運行截圖
安全

任務三

題目

  1. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  2. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密後經過網絡把密文發送給服務器
  3. 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,能夠用數組保存),而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  4. 客戶端顯示服務器發送過來的結果

運行截圖

任務四

題目

  1. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  2. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文發送給服務器
  3. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
  4. 服務器接收到後綴表達式表達式後,進行解密,而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  5. 客戶端顯示服務器發送過來的結果

運行截圖

任務五

題目

  1. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  2. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文和明文的MD5値發送給服務器
  3. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
  4. 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  5. 客戶端顯示服務器發送過來的結果

運行截圖

碼雲連接

參考資料

相關文章
相關標籤/搜索