課程:《程序設計與數據結構》
班級: 1723
姓名: 王志偉
學號:20172309
實驗教師:王志強老師
實驗日期:2018年6月13日
必修/選修: 必修html
實驗要求:java
1.夥伴1編寫服務器端程序,接收客戶端發送的數據(形式以下:12 15 8 100 25 34 19),將其排序後,發回給客戶端。
2.夥伴2編寫客戶端程序,將一串字符串(形式以下:12 15 8 100 25 34 19)發送給服務器端,接收排序後的程序,並顯示。
3.截圖上傳,附上碼雲地址。git
實驗結果:
算法
實驗要求:數組
- 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 結對實現中綴表達式轉後綴表達式的功能 MyBC.java
- 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用MyDC.java
- 上傳測試代碼運行結果截圖和碼雲連接
實驗要求:網絡
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式經過網絡發送給服務器
- 服務器接收到後綴表達式,調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
實驗結果:
數據結構
實驗要求:加密
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密後經過網絡把密文發送給服務器
- 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,能夠用數組保存),而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
實驗要求:
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
實驗要求:
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文和明文的MD5値發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
實驗結果:
程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/tree/master/Test/test4/wednesdaytest/test5
問題一:運行了之後一直沒反應,(保證本身寫的代碼沒問題!)
> //出現問題 > String info=null; > String temp=null; > while(!((temp = bufferedReader.readLine()) ==null)){//當使用while語句時,由於temp一直是空的,因此循環一直進行!(在前面應該對temp進行賦值,令temp = info) > info = temp; > System.out.println("我是服務器,學號【20172310】用戶信息爲:" + info); > }
解決方案:出現這個問題的方法多是使用的字符標準不一樣:
客服端與服務器都得使用「UTF-8」標準。
>public static void main(String args[ ]) throws Exception{//此處只能使用命令行輸入命令 > DHParameterSpec DHP= >new DHParameterSpec(skip1024Modulus,skip1024Base); > > KeyPairGenerator kpg= KeyPairGenerator.getInstance("DH"); > kpg.initialize(DHP); > KeyPair kp=kpg.genKeyPair(); > > PublicKey pbk=kp.getPublic(); > PrivateKey prk=kp.getPrivate(); > // 保存公鑰 > FileOutputStream f1=new FileOutputStream(args[0]); > ObjectOutputStream b1=new ObjectOutputStream(f1); > b1.writeObject(pbk); > // 保存私鑰 > FileOutputStream f2=new FileOutputStream(args[1]); > ObjectOutputStream b2=new ObjectOutputStream(f2); > b2.writeObject(prk); > }
而我想要的是在想使用這個程序,調用一個方法就行,所以,咱們能夠這樣改:
> public static void fun(String s1,String s2) throws Exception{//將 args[] 改爲一個方法+參數 > DHParameterSpec DHP= new DHParameterSpec(skip1024Modulus,skip1024Base); > KeyPairGenerator kpg= KeyPairGenerator.getInstance("DH"); > kpg.initialize(DHP); > KeyPair kp=kpg.genKeyPair(); > PublicKey pbk=kp.getPublic(); > PrivateKey prk=kp.getPrivate(); > //保存公鑰 > FileOutputStream f1=new FileOutputStream(s1); > ObjectOutputStream b1=new ObjectOutputStream(f1); > b1.writeObject(pbk); > //保存私鑰 > FileOutputStream f2=new FileOutputStream(s2); > ObjectOutputStream b2=new ObjectOutputStream(f2); > b2.writeObject(prk); > }
這樣咱們想要實現這個功能,只須要調用這個方法就好了。
實驗五是在實驗三的基礎上作的,用到了實驗三詳細說明的密碼學內容。在學實驗三的時候,根本看不懂!!!多是本身沒認真看所有是複製粘貼的。不過如今從新學了一下感受好多了,好像能看出個因此然出來了。實驗五的目的是讓咱們學會用加密形式進行傳輸,雖然在實驗的過程當中出現了不少錯誤,但最後都解決了,並且在作實驗的過程當中發現弄這個實驗其實也挺有趣的。最後提交做業的時候發現本身是交的比較早的,由於我是站在巨人的肩膀上完成實驗的(參考了網上的一些方法)!在此感謝他們~
1.java密碼學算法
2.java IO流總結
3.IO流詳解
4.DH算法原理