• 实验五


    北京电子科技学院(BESTI)

                  

    课程:Java程序与设计         班级:1351            

    姓名:符钰婧

    学号:20135128

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

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

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

    实验名称:Java网络编程及安全                                                           

    实验目的与要求:结对编程,实现客户端和服务器之间数据的发送与接收,实现加解密和验证Hash函数值。

    实验仪器:

    名称

    型号

    数量

    PC

    TOSHIBA

    1

    Eclipse

    LUNA

    1

    一、实验内容

    1. 基于Java Socket实现安全传输

    2. 基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器

    3. 使用Git进行版本控制

    4. 选择对称算法进行数据加解密.

    5. 选择非对称算法对对称加密密钥进行密钥分发.

    6. 选择合适的Hash算法进行完整性验证.

    二.实验步骤
      1.建立一个Socket对象,用来连接特定服务器的指定端口,输入的参数是ip地址和端口,注意ip地址是服务器的ip地址,即运行服务器的那台主机的ip地址。

      在命令行中输入ipconfig,如下图所示:

       2.用BufferedReader对象获得从服务器传来的网络输入流,用PrintWriter对象获得从客户端向服务器输出数据的网络输出流,用BufferedReader对象创建键盘输入流,以便客户端从键盘上输入信息。以上根据TCP的客户端代码编写。

     3.先用RSA算法加密DES的秘钥,加密采用服务器的公钥。将加密后的秘钥传送给服务器。

     4.用DES算法加密明文,将密文传到服务器。

     5.计算明文的Hash函数值,传送给服务器。

      以上用到的加密算法、秘钥、Hash函数计算过程均利用的老师提供的代码。最后从网络输入流读取结果,把从服务端返回的结果输出出来。在抛出异常部分,因为继承的是Exception类,所以直接输出抛出的异常。

       6.服务器代码:

    import java.io.BufferedInputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.net.ServerSocket;
    import java.net.Socket;

    import java.security.SecureRandom;

    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    public class ServerTest {
    int port = 8821;

    void start() {
    Socket s = null;
    try {
    ServerSocket ss = new ServerSocket(port); //创建一个ServerSocket套接字对象,并绑定在8821端口上
    while (true) {
    // 选择进行传输的文件
    String filePath = "C:\Users\田雨晴\Desktop\服务器\jiami.txt";
    File fi = new File(filePath); //通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
    System.out.println("文件长度:" + (int) fi.length());

    s = ss.accept();
    System.out.println("建立socket链接");
    DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream())); //DataInputStream:使用指定的底层 InputStream 创建一个 DataInputStream;
    dis.readByte(); //返回此输入流的下一个字节,以有符号 8 位 byte 的形式表示。

    DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
    DataOutputStream ps = new DataOutputStream(s.getOutputStream());//创建一个新的数据输出流,将数据写入指定基础输出流

    ps.writeUTF(fi.getName());
    ps.flush();
    ps.writeLong((long) fi.length());
    ps.flush();

    int bufferSize = 8192; //缓冲区,1k
    byte[] buf = new byte[bufferSize];

    while (true) {
    int read = 0;
    if (fis != null) {
    read = fis.read(buf);
    }

    if (read == -1) {
    break;
    }
    ps.write(buf, 0, read);
    }
    ps.flush();// 直到socket超时,导致数据不完整。
    fis.close();
    s.close();
    System.out.println("文件传输完成");
    }

    } catch (Exception e) {
    e.printStackTrace();
    }

    代码写好后,先运行服务器,再运行客户端,显示“服务器已经启动后”启动客户端,,连接成功会显示“已经建立连接”,然后就可以从客户端输入数据发送到服务器。

     

    三.实验感想

        这次实验中我遇到些问题,一是两台电脑一直无法连通,不知道是网络原因还是什么,之后用自己的WiFi就连通了,二是怎么将代码整合到一起,三是怎么实现服务器与客户端的连接,通过命令行得到了正确的ip地址,终于成功的实现了连接。这次实验主要是在已有的代码之上把功能在同一个程序中实现,在实验之前老师已经给了TCP的代码和密码算法的加解密方法,这给我们的编程带来了极大的方便,所以我们要做的就是弄懂这些代码的意思,内化成自己的东西并能够掌握运用。

  • 相关阅读:
    测试工具PerfDog的使用
    1.人工智能解读与Python简介
    如何提高百度网盘下载速度小技巧(亲测有效!)
    学习方法
    字符串换行工具类/每隔几位插入指定字符串
    java对pdf文件加文字水印 itextpdf
    centos 7.6 安装jdk8
    1 elk软件的安装
    Springboot 2.2.1 与activeMq 集成2 topic 发布者,订阅者
    Springboot 2.2.1 与activeMq 集成2 queue 消息
  • 原文地址:https://www.cnblogs.com/fuyujing/p/4569959.html
Copyright © 2020-2023  润新知