实验五

北京电子科技学院(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的代码和密码算法的加解密方法,这给我们的编程带来了极大的方便,所以我们要做的就是弄懂这些代码的意思,内化成自己的东西并能够掌握运用。

原文地址:https://www.cnblogs.com/fuyujing/p/4569959.html