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% |