Java实验报告(实验五)

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

                                                

实验仪器:

名称

型号

数量

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

        }

    }

}

 截图:

 

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

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

三、实验感想:

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

 

PSP时间

 

步骤

耗时

百分比

需求分析

 1h

 16.7%

设计

 1h  16.7%

代码实现

 2h  33.2%

测试

 1h  16.7%

分析总结

 1h  16.7%
posted @ 2015-06-11 23:47  20135116  阅读(314)  评论(0编辑  收藏  举报