課程:Java程序設計 班級:1351 姓名:王瑋怡 學號:20135116html
成績: 指導教師:婁嘉鵬 實驗日期:2015.6.9java
實驗密級: 預習程度: 實驗時間:15:20-18:00算法
儀器組次:11 必修/選修: 實驗序號:5編程
實驗名稱: TCP傳輸及加解密 服務器
實驗內容:網絡
1.運行教材上TCP代碼,結對進行,一人服務器,一人客戶端;併發
2.利用加解密代碼包,編譯運行代碼,一人加密,一人解密;socket
3.集成代碼,一人加密後經過TCP發送;post
注:加密使用AES或者DES/AES或者DES加密密鑰key併發送,使用服務器的公鑰加密/公鑰算法使用RSA或DH/檢驗發送信息的完整性使用MD5或者SHA3;測試
4.用Git進行版本控制。
5.完成Blog
實驗儀器:
名稱 |
型號 |
數量 |
PC
|
Macbook Air(win7系統) | 1 |
結對夥伴:20135109高藝桐,
博客地址:http://www.cnblogs.com/gyt0520/p/4570277.html
我負責服務器,她負責客戶端
一、代碼
服務器:
import java.net.*;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class MyServer {
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
ServerSocket sc = null;
ServerSocket sc1 = null;
Socket socket=null;
Socket socket1=null;
try {
sc= new ServerSocket(4431);//建立服務器套接字
sc1= new ServerSocket(4430);//建立服務器套接字
System.out.println("端口號:" + sc.getLocalPort());
System.out.println("服務器1已經啓動...");
System.out.println("端口號:" + sc1.getLocalPort());
System.out.println("服務器2已經啓動...");
socket = sc.accept(); //等待客戶端鏈接
System.out.println("已經創建鏈接");
socket1 = sc1.accept(); //等待客戶端鏈接
System.out.println("已經創建1鏈接");
//得到網絡輸入流對象的引用
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader in1 = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
////得到網絡輸出流對象的引用
System.out.print("已接收\n");
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
String aline=in.readLine();//讀取客戶端傳送來的數據
String aline1=in1.readLine();
System.out.print("寫入文件中...\n");
byte [] bytes = aline.getBytes("GB2312");
byte [] bytes1 = aline1.getBytes("GB2312");
aline = new String(bytes, "GB2312");
aline1 = new String(bytes1, "GB2312");
FileOutputStream s=new FileOutputStream("key1.dat");
s.write(bytes);
FileOutputStream s1=new FileOutputStream("SEnc.dat");
s1.write(bytes1);
System.out.print("已寫入文件\n");
//生成解密密鑰
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
byte[ ] kb=k.getEncoded( );
FileOutputStream f2=new FileOutputStream("keykb1.dat");
f2.write(kb);
System.out.print("生成解密密鑰\n");
// 打印密鑰編碼中的內容
for(int i=0;i<kb.length;i++){
// System.out.print(kb[i]+",");
}
//解密
FileInputStream a=new FileInputStream("SEnc.dat");
int num=a.available();
byte[ ] ctext=new byte[num];
a.read(ctext);
FileInputStream f1=new FileInputStream("keykb1.dat");
int num2=f1.available();
byte[ ] keykb=new byte[num2];
f1.read(keykb);
SecretKeySpec e=new SecretKeySpec(keykb,"DESede");
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);
byte []ptext=cp.doFinal(ctext);
String p=new String(ptext,"GB2312");
System.out.print("解密中...\n");
System.out.println(p);
//返回
System.out.println("從客戶端接收到信息爲:"+p); //經過網絡輸出流返回結果給客戶端
out.println(p);
out.close();
in.close();
sc.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
截圖:
2、遇到的問題及怎樣解決:
將程序包中程序整合時常常容易出現重定義和變量名佔用的問題,此時只須要註銷掉重複定義的部分或者更改變量名便可,但要注意後來引用部分也須要更改變量名
3、實驗感想:
經過此次實驗,我和同伴最大的收穫是通過不斷努力,將零碎的代碼段拼湊起來並運行出來。過程是複雜的,可是在同窗的幫助和咱們本身的不斷嘗試下,仍是有必定進展。說實話,對於我這樣對編程不太精通的幼兒園級學者來講,網絡鏈接、傳送、反饋上有不少很難的地方,遇到有問題的地方經常感受無從下手,一般即便在上網翻閱不少資料也無濟於事,必定要尋求大神們的幫助才能解決,所以,咱們每次的實驗結果不管怎樣,都是不少人一塊兒的智慧。
PSP時間
步驟 |
耗時 |
百分比 |
需求分析 |
1h |
16.7% |
設計 |
1h | 16.7% |
代碼實現 |
2h | 33.2% |
測試 |
1h | 16.7% |
分析總結 |
1h | 16.7% |