zoukankan      html  css  js  c++  java
  • 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 方法。

    2.表达式的三种标识方法
    • OP + S1 + S2 为前缀表示法
    • S1 + OP + S2 为中缀表示法
    • S1 + S2 + OP 为后缀表示法
    3.MyDC

    伪代码

    • 设置一个操作数栈,开始栈为空;
    • 从左到右扫描后缀表达式,遇操作数,进栈;
    • 若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕。此时,栈中仅有一个元素,即为运算的结果。

    代码清单

    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

    伪代码

    • 设立一个栈,存放运算符,首先栈为空;
    • 从左到右扫描中缀式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
    • 若遇到运算符,则与栈顶比较,比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;
    • 若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。
    • 当栈变成空时,输出的结果即为后缀表达式。

    代码清单

    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. 客户端显示服务器发送过来的结果

    运行截图

    码云链接

    参考资料

  • 相关阅读:
    人物-作家-马克·吐温:马克·吐温
    人物-发明家-特斯拉:尼古拉·特斯拉
    视觉暂留-Info:这些神奇的“视觉暂留”动画,每一幅都让人拍案叫绝!
    视觉暂留:余晖效应/视觉暂留
    mingetty
    mesg
    md5sum
    man.conf
    man
    makemap
  • 原文地址:https://www.cnblogs.com/ysz-123/p/10955450.html
Copyright © 2011-2022 走看看