20155236 《Java程序设计》实验五(网络编程与安全)实验报告
一、实验内容及步骤
- 任务一:
编写MyBC.java实现中缀表达式转后缀表达式的功能
编写MyDC.java实现从上面功能中获取的表达式中实现后缀表达式求值的功能 - 任务二:
结对编程:一人负责客户端,另一人负责服务器
注意责任归宿,要会通过测试证明自己没有问题
基于Java Socket实现客户端/服务器功能,传输方式用TCP
客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
客户端显示服务器发送过来的结果 - 任务三:
客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
其他要求同任务二 - 任务四:
客户端和服务器用DH算法进行3DES或AES算法的密钥交换
其他要求同任务三 - 任务五:
服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
其他要求同任务四
实验内容
任务一:MyBC,MyDC,MyBCTest
算法描述:(中缀转后缀)
1.设置一个运算符栈,设置一个后缀表达式字符串;
从左到右依次对中缀表达式中的每个字符ch分别进行以下处理,直至表达式结束。
-
- 若ch是左括号‘(’,将其入栈;
- 若ch是数字,将其后连续若干数字添加到后缀表达式字符串之后,并添加空格作为分隔符;
- 若ch是运算符,先将栈顶若干优先级高于ch的运算符出栈,添加到后缀表达式字符串之后,再将ch入栈。当‘(’运算符在栈中时,它的优先级最低。
- 若ch是‘)’,则若干运算符全部出栈,直到出栈的是左括号,一对括号匹配。
- 若ch是左括号‘(’,将其入栈;
3.若表达式结束,将栈中运算符全部出栈,添加到后缀表达式字符串之后。
代码如下:
public static String toPostfix(String expr){
MyStack<String> stack = new MyStack<>(expr.length());
String postfix = "";
int i = 0;
while(i<expr.length()){
char ch = expr.charAt(i);
switch (ch){
case '+':
case '-':while(!stack.isEmpty() && !stack.get().equals("("))
postfix += stack.pop();
//postfix += " ";
stack.push(ch + "");
i++;
break;
case '*':
case '/':while (!stack.isEmpty() && (stack.get().equals("*")||stack.get().equals("/")))
postfix += stack.pop();
//postfix += " ";
stack.push(ch + "");
i++;
break;
case '(':stack.push(ch + "");
i++;
break;
case ')':String out = stack.pop();
while(out!=null && !out.equals("(")){
postfix += out;
out = stack.pop();
//postfix += " ";
}
i++;
break;
default:while(i < expr.length() && ch>='0' && ch<='9'){
postfix += ch;
i++;
if(i<expr.length())
ch = expr.charAt(i);
}
postfix += " ";
}
}
while (!stack.isEmpty())
postfix += stack.pop();
return postfix;
}
算法描述 (后缀表达式的求值)
1.设置一个操作数栈,从左向右依次对后缀表达式字符串中的每个字符ch进行处理;
-
- 若ch是数字,先将其后连续若干数字转化为整数,再将该整数入栈;
- 若ch是运算符,出栈两个值进行运算,运算结果再入栈;
- 3.重复以上步骤,直至后缀表达式结束,栈中最后一个数字就是所求表达式的值。
- 若ch是数字,先将其后连续若干数字转化为整数,再将该整数入栈;
代码如下:
public int value(String postfix){
Stack<Integer> stack = new Stack();
int i = 0, result = 0;
while(i < postfix.length()){
char ch = postfix.charAt(i);
if(ch>='0' && ch<='9'){
result = 0;
while(ch!=' '){
result = result*10 + Integer.parseInt(ch+"");
i++;
ch = postfix.charAt(i);
}
i++;
stack.push(new Integer(result));
}
else{
int y = stack.pop().intValue();
int x = stack.pop().intValue();
switch (ch){
case ADD:
result = x + y;
break;
case SUBTRACT:
result = x - y;
break;
case MULTIPLY:
result = x * y;
break;
case DIVIDE:
result = x / y;
}
stack.push(new Integer(result));
i++;
}
}
return stack.pop().intValue();
}
测试类 MyBCTest
public class NewMyDCTester {
public static void main(String [] args) {
String expression;
int result;
try
{
Scanner in = new Scanner(System.in);
NewMyDC evaluator = new NewMyDC();
System.out.println ("Enter a valid postfix expression: ");
expression = in.nextLine();
String postfix = MyBC.toPostfix(expression);
System.out.println ("The postfix expression is :" + postfix);
result = evaluator.value (postfix);
System.out.println ("That expression equals :" + result);
}
catch (Exception IOException)
{
System.out.println("Input exception reported");
}
}
}
运行结果:
任务二 客户端和服务器
我负责的是服务器部分:
任务三 在任务二的基础上实现一个加密算法进行加密和解密
任务四 客户端和服务器用DH算法进行3DES或AES算法的密钥交换。
任务五 MD5
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 1 h | 15.38% |
设计 | 2 h | 30.77% |
代码实现 | 2 h | 30.77% |
测试 | 30min | 7.69% |
分析总结 | 1h | 15.38% |