2017-2018-2 20165325 实验五《网络编程与安全》实验报告
一、网络编程与安全-1
1、检查点要求
两人一组结对编程:
0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
- 上传测试代码运行结果截图和码云链接
2、实验截图
测试代码运行结果截图如下:
上图为MyBC.java功能截图;
上图为MyDC.java功能截图;
3、码云链接
MyBC.java : https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/MyBC.java
MyDC.java : https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/MyDC.java
TestMyBC.java : https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/Test/TestMyBC.java
TestMyDC.java : https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/Test/TestMyDC.java
注:上述代码实现的是整数情况下的加减乘除运算,若要求实现分数运算功能,详见码云链接:分数功能的四则运算项目链接
二、网络编程与安全-2
1、检查点要求
结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
2、实验截图
测试代码运行结果截图如下:
上图为单机测试;
上图为客户端测试;
服务器端测试截图详见搭档博客。
3、码云链接
Client.java:https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Client.java
Server.java:https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Server.java
三、网络编程与安全-3
1、检查点要求
加密结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
2、实验截图
测试结果截图如下:
上图为单机测试(客户端);
上图为单机测试(服务器);
上图为客户端联机测试;
服务器联机测试见搭档博客;
3、码云链接
码云链接:
Client_2.java:https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Client_2.java
Server_2.java:https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Server_2.java
Skey.java:https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Skey.java
Skey_kb.java:https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Skey_kb.java
四、网络编程与安全-4
1、检查点要求
密钥分发结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
2、实验截图
测试结果截图如图所示:
上图为单机测试(客户端);
上图为单机测试(服务器);
上图为客户端联机测试;
服务器联机测试见搭档博客;
3、码云链接
码云链接:
https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Client_3.java
https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/KeyAgree.java
https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Key_DH.java
https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Server_3.java
五、网络编程与安全-5
1、检查点要求
实验五 网络编程与安全-5
完整性校验结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
2、实验截图
上图为单机测试(客户端);
上图为单机测试(服务器);
上图为客户端联机测试;
服务器联机测试见搭档博客;
3、码云链接
码云链接:
https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Client_4.java
https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/DigestPass.java
https://gitee.com/BESTI-IS-JAVA-2018/20165325/blob/master/Exp5/src/Server_4.java
附:遇到的问题
1、StringBuffer类的测试
在Test类的assertEquals()
中不能调用两个StringBuffer类作比较,最好用.toString()
方法转化为字符串进行比较。
2、JAVA中的goto语句
在检查点1的开发中,我突然想用一个“JAVA中的goto语句”实现。上网查询链接如下:
http://blog.51cto.com/lavasoft/178997
3、错误:java.net.SocketException: Connection reset
参考链接:
https://blog.csdn.net/u013766398/article/details/51381852/
解决办法:
1、网络编程时未正确捕获java.net.SocketException, 客户端先关闭就会报这个异常;(检查发送数据是否符合服务器接收格式,不然的话服务器会自动断开连接,这样,socket就会被关闭,那么你就不能使用IO流读取数据,这样就会报这个错误)
2、数据库和应用服务器的网段不同(这个查看一下,可能性较小)
3、好像说防火墙的比较多。。。。(试一下,关闭)
4、大部分是网络的原因。提交post的东西多,然后服务器接收就超时了(这个只能说一般可能性较小)
4、关于byte数组和对象的相互转化
首先要明确的是,转化有特定的条件。bytes在反序列化为Object的前提是byte[]是通过ObjectOutputStream序列化的,否则直接将一个任意的byte[]转换成Object时会报错,错误信息为:
java.io.StreamCorruptedException: invalid stream header:
转化方法——Byte[] 2 Object:
(byte b[])
ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream (b));
Object o = ois.readObject();
Object 2 Byte[]:
(Object obj)
byte b[] = null;
ByteArrayInputStream bais = new ByteArrayInputStream();
ObjectOutputStream oos = new ObjectOutputStream(bais);
oos.writeObject(obj);
5、参考链接
Java 密码学算法:http://www.cnblogs.com/rocedu/p/6683948.html