课程: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% |