课程:Java程序设计                         班级:1351            姓名:王玮怡      学号:20135116

成绩:             指导教师:娄嘉鹏              实验日期:2015.6.9

实验密级:         预习程度:             实验时间:15:20-18:00

仪器组次:11          必修/选修:                  实验序号:5

实验名称:    TCP传输及加解密  

实验内容:

1.运行教材上TCP代码,结对进行,一人服务器,一人客户端;

2.利用加解密代码包,编译运行代码,一人加密,一人解密;

3.集成代码,一人加密后通过TCP发送;

注:加密使用AES或者DES/AES或者DES加密密钥key并发送,使用服务器的公钥加密/公钥算法使用RSA或DH/检验发送信息的完整性使用MD5或者SHA3;

4.用Git进行版本控制。

5.完成Blog

                                                

实验仪器:

名称

型号

数量

 

Macbook Air(win7系统)

1

 

结对伙伴:20135109高艺桐,

博客地址:

我负责服务器,她负责客户端 


代码


 

服务器:

 

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);
        }
    }
}

 截图:

 

java实训中遇到的困难及解决 java实验报告遇到的问题_客户端

二、遇到的问题及怎样解决:

将程序包中程序整合时经常容易出现重定义和变量名占用的问题,此时只需要注销掉重复定义的部分或者更改变量名即可,但要注意后来引用部分也需要更改变量名

三、实验感想:

  通过这次实验,我和同伴最大的收获是经过不断努力,将零碎的代码段拼凑起来并运行出来。过程是复杂的,但是在同学的帮助和我们自己的不断尝试下,还是有一定进展。说实话,对于我这样对编程不太精通的幼儿园级学者来说,网络连接、传送、反馈上有很多很难的地方,遇到有问题的地方常常感觉无从下手,通常即使在上网翻阅很多资料也无济于事,一定要寻求大神们的帮助才能解决,因此,我们每次的实验结果无论怎样,都是很多人一起的智慧。

 

PSP时间

 

步骤

耗时

百分比

需求分析

 1h

 16.7%

设计

 1h

 16.7%

代码实现

 2h

 33.2%

测试

 1h

 16.7%

分析总结

 1h

 16.7%




实验内容:

1.运行教材上TCP代码,结对进行,一人服务器,一人客户端;

2.利用加解密代码包,编译运行代码,一人加密,一人解密;

3.集成代码,一人加密后通过TCP发送;

注:加密使用AES或者DES/AES或者DES加密密钥key并发送,使用服务器的公钥加密/公钥算法使用RSA或DH/检验发送信息的完整性使用MD5或者SHA3;

4.用Git进行版本控制。

5.完成Blog

                                                

实验仪器:

名称

型号

数量

 

Macbook Air(win7系统)

1