1、实验报告封面
课程:Java程序设计 班级:1753班 姓名:石淦铭
学号:20175325
指导教师:娄嘉鹏 实验日期:2019年5月28日
实验序号:实验五
实验名称:网络编程与安全html
2、实验内容及步骤:java
(一)、实验一
一、题目:git
二、解答:算法
public class MyBC { private Stack theStack; private String input; private String output = ""; public MyBC(String in) { input = in; int stackSize = input.length(); theStack = new Stack(stackSize); } public String doTrans() { for (int j = 0; j < input.length(); j++) { char ch = input.charAt(j); switch (ch) { case '+': case '-': gotOper(ch, 1); break; case '*': case '/': gotOper(ch, 2); break; case '(': theStack.push(ch); break; case ')': gotParen(ch); break; default: output = output + ch; break; } } while (!theStack.isEmpty()) { output = output + theStack.pop(); } return output; } public void gotOper(char opThis, int prec1) { while (!theStack.isEmpty()) { char opTop = theStack.pop(); if (opTop == '(') { theStack.push(opTop); break; } else { int prec2; if (opTop == '+' || opTop == '-') prec2 = 1; else prec2 = 2; if (prec2 < prec1) { theStack.push(opTop); break; } else output = output + opTop; } } theStack.push(opThis); } public void gotParen(char ch) { while (!theStack.isEmpty()) { char chx = theStack.pop(); if (chx == '(') break; else output = output + chx; } } class Stack { private int maxSize; private char[] stackArray; private int top; public Stack(int max) { maxSize = max; stackArray = new char[maxSize]; top = -1; } public void push(char j) { stackArray[++top] = j; } public char pop() { return stackArray[top--]; } public char peek() { return stackArray[top]; } public boolean isEmpty() { return (top == -1); } } }
MyDC:express
import java.util.StringTokenizer; import java.util.Stack; public class MyDC { private final char ADD = '+'; private final char SUBTRACT = '-'; private final char MULTIPLY = '*'; private final char DIVIDE = '/'; 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)) { //从栈中弹出操做数2 op2 = stack.pop(); //从栈中弹出操做数1 op1 = stack.pop(); //根据运算符和两个操做数调用evalSingleOp计算result; result=evalSingleOp(token.charAt(0), op1, op2); //计算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; } }
(二)、实验二
一、题目:编程
二、解答:数组
Socket类
Socket
构造方法:Socket(String host,int port)
ServerSocket
对象与服务器端套接字ServerSocket(int port)
客户端:安全
import java.net.*; import java.io.*; public class Client { public static void main(String srgs[]) throws Exception { try { Socket socket=new Socket("127.0.0.1",5325); System.out.println("客户端启动成功"); // 向本机的10001端口发出客户请求 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 由系统标准输入设备构造BufferedReader对象 PrintWriter write = new PrintWriter(socket.getOutputStream()); // 由Socket对象获得输出流,并构造PrintWriter对象 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 由Socket对象获得输入流,并构造相应的BufferedReader对象 String readline, infix, expression; readline = br.readLine(); MyBC theTrans = new MyBC(readline); infix = theTrans.doTrans(); StringBuilder newInfix = new StringBuilder(infix.replace(" ","")); for (int i = 1; i < infix.length()+(i+1)/2 ; i=i+2) { newInfix.insert(i," "); } System.out.println("后缀表达式为: " + newInfix); expression=newInfix.toString(); while (!readline.equals("end")) { // 若从标准输入读入的字符串为 "end"则中止循环 write.println(expression); // 将从系统标准输入读入的字符串输出到Server write.flush(); // 刷新输出流,使Server立刻收到该字符串 System.out.println("客户端发来的消息为:" + expression); // 在系统标准输出上打印读入的字符串 System.out.println("服务器发来的结果为:" + in.readLine()); // 从Server读入一字符串,并打印到标准输出上 readline = br.readLine(); // 从系统标准输入读入一字符串 } // 继续循环 write.close(); // 关闭Socket输出流 in.close(); // 关闭Socket输入流 socket.close(); // 关闭Socket } catch (Exception e) { System.out.println(e);//输出异常 } finally { } } }
服务端:服务器
import java.net.*; import java.io.*; public class Server{ public static void main(String srgs[]) throws Exception { ServerSocket sc = null; Socket socket=null; try { MyDC evaluator = new MyDC(); sc= new ServerSocket(5325);//建立服务器套接字 System.out.println("端口号:" + sc.getLocalPort()); System.out.println("服务器启动"); socket = sc.accept(); //等待客户端链接 System.out.println("已经创建链接");//得到网络输入流对象的引用 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//得到网络输出流对象的引用 PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); String aline2=in.readLine(); System.out.println("客户端发来的信息为:"+aline2); int ans = evaluator.evaluate(aline2); out.println(ans); System.out.println("result = "+ans); } catch (Exception e) { System.out.println(e); } } public static byte[] parseHexStr2Byte(String hexStr) { if (hexStr.length() < 1) return null; byte[] result = new byte[hexStr.length()/2]; for (int i = 0;i< hexStr.length()/2; i++) { int high = Integer.parseInt(hexStr.substring(i*2, i*2+1 ), 16); int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); result[i] = (byte) (high * 16 + low); } return result; } }
结果截图:
网络
(三)、实验三
一、题目:
二、解答:
SecretKey k=kg.generateKey( )
(四)、实验四
一、题目:
二、解答:
KeyPairGenerator类
建立DH公钥和私钥(五)、实验五
一、题目:
二、解答:
3、PSP:
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 30 | 11% |
设计 | 50 | 19% |
代码实现 | 90 | 34% |
测试 | 45 | 17% |
分析总结 | 50 | 19% |