20155227 《Java程序设计》实验五 Java网络编程及安全实验报告
20155227 《Java程序设计》实验五 Java网络编程及安全实验报告
实验内容
任务一:
- 编写MyBC.java实现中缀表达式转后缀表达式的功能。
- 编写MyDC.java实现从上面功能中获取的表达式中实现后缀表达式求值的功能。
我们如何编程实现bc? 把中缀式转化后缀式调用MyDC.java中的evaluate方法就行了。这样问题转化为如何由中缀式求得后缀式?
由中缀式求得后缀式可以使用栈,伪代码如下:
设立一个栈,存放运算符,首先栈为空;
从左到右扫描中缀式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
若遇到运算符,则与栈顶比较,比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;
若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。
当栈变成空时,输出的结果即为后缀表达式。
MyBC:
import java.util.*;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.Arrays;
public class MyBC {
private static LinkedList<String> op1 = new LinkedList<>();
private static LinkedList<String> op2 = new LinkedList<>();
private static StringBuilder a = new StringBuilder();
public StringBuilder houzhui(LinkedList<String> list) {
Iterator<String> i = list.iterator();
while (i.hasNext()) {
String s = i.next();
if (isOperator(s)) {
if (op1.isEmpty()) {
op1.push(s);
} else {
if (priority(op1.peek()) <= priority(s) && !s.equals(")")) {
op1.push(s);
} else if (!s.equals(")") && priority(op1.peek()) > priority(s)) {
while (op1.size() != 0 && priority(op1.peek()) >= priority(s)
&& !op1.peek().equals("(")) {
if (!op1.peek().equals("(")) {
String operator = op1.pop();
a.append(operator).append(" ");
op2.push(operator);
}
}
op1.push(s);
} else if (s.equals(")")) {
while (!op1.peek().equals("(")) {
String operator = op1.pop();
a.append(operator).append(" ");
op2.push(operator);
}
op1.pop();
}
}
} else {
a.append(s).append(" ");
op2.push(s);
}
}
if (!op1.isEmpty()) {
Iterator<String> iterator = op1.iterator();
while (iterator.hasNext()) {
String operator = iterator.next();
a.append(operator).append(" ");
op2.push(operator);
iterator.remove();
}
}
return a;
}
private static boolean isOperator(String oper) {
if (oper.equals("+") || oper.equals("-") || oper.equals("/") || oper.equals("*")
|| oper.equals("(") || oper.equals(")")) {
return true;
}
return false;
}
private static int priority(String s) {
switch (s) {
case "+":
return 1;
case "-":
return 1;
case "*":
return 2;
case "/":
return 2;
case "(":
return 3;
case ")":
return 3;
default:
return 0;
}
}
}
我们如何实现dc?
这要用到栈。对逆波兰式求值时,不需要再考虑运算符的优先级,只需从左到右扫描一遍后缀表达式即可。求值伪代码如下:
设置一个操作数栈,开始栈为空;
从左到右扫描后缀表达式,遇操作数,进栈;
若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕。
此时,栈中仅有一个元素,即为运算的结果。
MyDC:
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.*;
public class MyDC {
public static int evaluate(StringBuilder b) {
LinkedList<String> mList = new LinkedList<>();
String[] postStr = b.toString().split(" ");
int result;
for (String s : postStr) {
if (fuhao(s)) {
if (!mList.isEmpty()) {
int num1 = Integer.valueOf(mList.pop());
int num2 = Integer.valueOf(mList.pop());
if (s.equals("/") && num1 == 0) {
System.out.println("除数不能为0");
return 0;
}
int newNum = cal(num2, num1, s);
mList.push(String.valueOf(newNum));
}
} else {
mList.push(s);
}
}
//if (!mList.isEmpty()) {
//System.out.println("result: "+mList.pop());
result=Integer.parseInt(mList.pop());
// }
return result;
}
private static boolean fuhao(String a) {
if (a.equals("+") || a.equals("-") || a.equals("/") || a.equals("*")
|| a.equals("(") || a.equals(")")) {
return true;
}
return false;
}
/*private static int priority(String s) {
switch (s) {
case "+":
return 1;
case "-":
return 1;
case "*":
return 2;
case "/":
return 2;
case "(":
return 3;
case ")":
return 3;
default:
return 0;
}
}*/
private static int cal(int num1, int num2, String operator) {
switch (operator) {
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
return num1 / num2;
default:
return 0;
}
}
}
/*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;
}
}*/
Test:
import java.util.LinkedList;
import java.util.*;
public class Test {
public static void main(String[] args){
LinkedList<String> list=new LinkedList<>();
StringBuilder result1;
int result2;
String expression, again;
System.out.println("请输入一个中缀表达式并以#结束");
Scanner scanner=new Scanner(System.in);
String s;
while (!(s=scanner.next()).equals("#")) {
list.add(s);
}
MyBC hz=new MyBC();
result1 = hz.houzhui(list);
System.out.println("后缀表达式: "+result1);
MyDC evaluator = new MyDC();
result2 = evaluator.evaluate(result1);
System.out.println("That expression equals " + result2);
System.out.println();
}
}

任务二
- 结对编程:一人负责客户端,另一人负责服务器
- 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
我负责的是服务器部分

任务三
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 其他要求同任务二

任务四
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 其他要求同任务三

任务五
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 其他要求同任务四

PSP(Personal Software Process)时间
| 步骤 | 耗时 | 百分比 |
|---|---|---|
| 需求分析 | 20min | 12.5% |
| 设计 | 20min | 12.5% |
| 代码实现 | 80min | 50% |
| 测试 | 20min | 12.5% |
| 分析总结 | 20min | 12.5% |
20155227 《Java程序设计》实验五 Java网络编程及安全实验报告的更多相关文章
- 20155205《Java程序设计》实验五(网络编程与安全)实验报告
20155205 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 两人一组结对编程 参考http://www.cnblogs.com/rocedu/p/6 ...
- 20165230 《Java程序设计》实验五《网络编程与安全》实验报告
20165230 <Java程序设计>实验五<网络编程与安全>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...
- 20145207《Java程序设计》实验五(网络编程与安全)实验报告
<Java 程序设计>实验五(网络编程与安全)实验报告 目录 改变 网络编程与安全实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.不过这篇博客我只能做到写 ...
- 20155218 《Java程序设计》实验五(网络编程与安全)实验报告
20155218 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面 ...
- 20155236 《Java程序设计》实验五(网络编程与安全)实验报告
20155236 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上 ...
- 20155304 2016-2017-2 《Java程序设计》实验五(网络编程与安全)实验报告
20155304 2016-2017-2 <Java程序设计>实验五(网络编程与安全)实验报告 实验内容及步骤: 一.两人一组结对编程: 参考http://www.cnblogs.com/ ...
- 20155310《Java程序设计》实验五(网络编程与安全)实验报告
20155310<Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 •任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上 ...
- 20155311《Java程序设计》实验五(网络编程与安全)实验报告
20155311<Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面 ...
- 20155318 《Java程序设计》实验五 (网络编程与安全)实验报告
20155318 <Java程序设计>实验五 (网络编程与安全)实验报告 实验内容 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技术相关API的 ...
- 20155319 《Java程序设计》实验五(网络编程与安全)实验报告
20155319 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 两人一组结对编程 参考http://www.cnblogs.com/rocedu/p/6 ...
随机推荐
- iOS亮屏解锁命令【iOS自动化测试】--使用ssh
前提:iOS越狱手机一个 越狱方法:使用pp助手, 爱思助手等 1.从Cydia安装以下软件: AppSync for iOSx(可安装破解软件).afc2add补丁(可访问整个iOS设备的系统文件) ...
- apt 安装 tomcat
apt 安装 tomcat 直接使用 agt-get 安装 apt-get install tomcat7 # or apt-get install tomcat8 需要一段时间后就安装完成了. 安装 ...
- ONOS的安装
ONOS的简介 ONOS(Open Network Operating System)开放网络操作系统,由 ON.Lab 使用 Java 及 Apache 实现发布的首款开源的SDN网络操作系统. O ...
- IOS Charles(代理服务器软件,可以用来拦截网络请求)
什么是Charles Charles是一款代理服务器软件,可以用来拦截网络请求 利用Charles能得知大部分公司app的数据来源和数据格式 下载地址:http://www.charlesproxy. ...
- 对Java中的异常的理解
1.What is exception in Java? Java使用异常描述程序中可能出现的不正常情况.这个不正常可以是java认为的不正常,也可以是你主观上的出乎意料(自定义异常).总而言之,异常 ...
- Bean Definition从加载、解析、处理、注册到BeanFactory的过程。
为了弄清楚Bean是怎么来的,花费了大把功夫,现在要把Bean Definition的加载.解析.处理.注册到bean工厂的过程记下来.这只是bean definition 的加载.解析.处理.注册过 ...
- C++中在子类实现父类的方法调用
- [SDOI2016]数字配对
题目 发现要求配对的条件是这样 \[a_j|a_i,\frac{a_i}{a_j}=p_1\] 我们考虑一下再来一个\(a_k\),满足 \[a_k|a_j,\frac{a_j}{a_k}=p_2\] ...
- 《metasploit渗透测试魔鬼训练营》学习笔记第三章----情报搜集
Kali渗透测试系统集成了metasploit开源的漏洞测试框架,是渗透测试必备的神器.下面是我在学习metasploit的笔记,有什么错误的地方请指出来,我会立即纠正的~ 一.情报搜集 1. ...
- 获取主机ip地址
直接访问http://icanhazip.com