由於在以前的結對編程中已經實現了這兩個功能,而且老師說能夠直接使用,我就直接使用了以前的InfixToSuffix
類和Calculator
類進行中綴轉後綴和計算,在ArithmeticTest
類中添加代碼後實現。html
TCP協議java
Java.net.Socketgit
SocketImpl
類的實例執行。應用程序經過更改建立套接字實現的套接字工廠能夠配置它自身,以建立適合本地防火牆的套接字。java.net
中提供了兩個類Socket
和ServerSocket
,分別用來表示雙向鏈接的客戶端和服務端。這是兩個封裝得很是好的類,使用很方便。Socket client = new Socket("127.0.01.", 80); ServerSocket server = new ServerSocket(80);
ipconfig
在cmd中查看本身的IP地址,要注意的是,在建立Socket的時候,若是是和結對夥伴的話,host
要填結對夥伴的IP,而若是是本身既作客戶端又作服務器時,host
能夠填127.0.0.1或localhost。//1.創建客戶端Socket鏈接,指定服務器位置和端口 Socket socket = new Socket("172.16.43.217",8800);
//2.獲得socket讀寫流 OutputStream outputStream = socket.getOutputStream(); PrintWriter(outputStream); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); //輸入流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
Scanner scanner = new Scanner(System.in); System.out.println("請輸入計算式:(以空格隔開每一個運算符和運算數)"); String expr = scanner.nextLine(); InfixToSuffix infixToSuffix = new InfixToSuffix(); infixToSuffix.conversion(expr); System.out.println("我傳送給服務器的信息爲:"+infixToSuffix.getMessage()); String info = new String(infixToSuffix.getMessage().getBytes("utf-8")); outputStreamWriter.write(info); outputStreamWriter.flush(); socket.shutdownOutput(); //接收服務器的響應 String reply = null; while (!((reply = bufferedReader.readLine()) == null)){ System.out.println("接收服務器的信息爲:" + reply); }
bufferedReader.close(); inputStream.close(); outputStreamWriter.close(); outputStream.close(); socket.close();
DES加密算法算法
FileInputStream f=new FileInputStream("key1.dat"); ObjectInputStream b=new ObjectInputStream(f); Key k=(Key)b.readObject( ); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); for(int i=0;i<ptext.length;i++){ System.out.print(ptext[i]+","); } System.out.println(""); byte ctext[]=cp.doFinal(ptext); for(int i=0;i<ctext.length;i++){ System.out.print(ctext[i] +","); } FileOutputStream f2=new FileOutputStream("SEnc.dat"); f2.write(ctext);
DataOutputStream/DataInputStream
,其中有一個方法叫wrtieUTF
,它將 UTF-8 字符串寫入字節流。先寫入以字節表示的 UTF-8 字符串長度(做爲 16 位整數),而後寫入表示字符串字符的字節。使用這個方法,在傳輸以後轉化成byte數組就很方便了。
DH算法編程
key_DH
類和keyAgree
類中的main方法,使其可以被引用。
String x=args[0]; MessageDigest m=MessageDigest.getInstance("MD5"); m.update(x.getBytes("UTF8")); byte s[ ]=m.digest( ); String result=""; for (int i=0; i<s.length; i++){ result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6); } System.out.println(result);
在任務四的代碼基礎上將運行代碼加入便可。數組
問題1解決方法:經過在網上查找發現這個錯誤好像是避免不了的,必須進行捕獲或者拋出。服務器
在建立socket時若是發生錯誤,將產生IOException,在程序中必須對之做出處理。因此在建立Socket或ServerSocket是必須捕獲或拋出例外。網絡
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
問題3解決方法:在剛剛的任務三的實驗過程當中有寫到,咱們找到了另一種方法來解決這個問題。數據結構
本學期的最後一次實驗了,感受java socket真的很是有意思,最後悔的是當時實驗三的最後一個節點作的不是很好,因此這回又去複習了半天密碼學的相關內容。
回顧一個學期的內容發現本身真的學到了不少,很開心。socket
下學期繼續加油。