20172308 实验五《Java面向对象程序设计 》实验报告

20172308 2017-2018-2 实验五 《网络编程与安全》报告

课程:《程序设计与数据结构》
班级: 1723
姓名: 周亚杰
学号:20172308
实验教师:王志强
实验日期:2018年6月13日
必修/选修: 必修

1.实验内容

  • 网络编程与安全-1:结对实现从获取的表达式中实现后缀表达式求值的功能

  • 网络编程与安全-2:客户端让用户输入中缀表达式,然后转化为后缀表达式,把后缀表达式通过网络发送给服务器,服务器接收后缀表达式,计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果

  • 网络编程与安全-3:客户端让用户输入中缀表达式,然后转化为后缀表达式,把后缀表达式用3DES或AES算法加密,通过网络把密文发送给服务器,服务器接收后缀表达式,进行解密(和客户端协商密钥),然后计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果

  • 网络编程与安全-4:客户端让用户输入中缀表达式,然后转化为后缀表达式,把后缀表达式用3DES或AES算法加密,通过网络把密文发送给服务器,客户端和服务器用DH算法进行3DES或AES算法的密钥交换,服务器接收后缀表达式,进行解密,然后计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果

  • 网络编程与安全-5:客户端让用户输入中缀表达式,然后转化为后缀表达式,把后缀表达式用3DES或AES算法加密,通过网络把密文和明文的MD5値发送给服务器,客户端和服务器用DH算法进行3DES或AES算法的密钥交换,服务器接收后缀表达式,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果

2. 实验过程及结果

注意责任归宿,要会通过测试证明自己没有问题
结对编程:1人负责客户端,一人负责服务器
基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 网络编程与安全-1:
    1.利用以前编写的四则运算代码结对实现中缀表达式转后缀表达式的功能
    2.利用以前编写的四则运算代码结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能
    3.实验结果截图:
    1320922-20180619124032096-1490168616.png

  • 网络编程与安全-2:
    1.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
    2.服务器接收到后缀表达式,计算后缀表达式的值,把结果发送给客户端
    3.客户端显示服务器发送过来的结果
    4.实验结果截图:
    1320922-20180619124349713-365793261.png

1320922-20180619124408226-1627465615.png

  • 网络编程与安全-3:
    1.客户端让用户输入中缀表达式,然后转化为后缀表达式,把后缀表达式用DES算法加密后通过网络把密文发送给服务器
    2.服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,通过QQ传递密钥文件),然后计算后缀表达式的值,把结果发送给客户端
    3.客户端显示服务器发送过来的结果
    4.实验结果截图:
    1320922-20180619124643635-690077558.png

1320922-20180619124653941-842414915.png

  • 网络编程与安全-4:
    1.客户端让用户输入中缀表达式,然后转化为后缀表达式,把后缀表达式用AES算法加密,通过网络把密文发送给服务器
    2.客户端和服务器用DH算法进行AES算法的密钥交换(密钥文件通过QQ传递)
    3.服务器接收到后缀表达式表达式后,进行解密,然后计算后缀表达式的值,把结果发送给客户端
    4.客户端显示服务器发送过来的结果
    5.实验结果截图:
    1320922-20180619125053702-773591402.png

1320922-20180619125114789-277168335.png

1320922-20180619125123363-1254021538.png

1320922-20180619125131434-777751032.png

  • 网络编程与安全-5:
    1.客户端让用户输入中缀表达式,然后转化为后缀表达式,把后缀表达式用AES算法加密通过网络把密文和明文的MD5値发送给服务器
    2.客户端和服务器用DH算法进行AES算法的密钥交换
    3.服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则计算后缀表达式的值,把结果发送给客户端
    4.客户端显示服务器发送过来的结果
    5.实验结果截图:
    1320922-20180619125513064-359261533.png

1320922-20180619125530897-637108195.png

1320922-20180619125539762-763081837.png

1320922-20180619125552223-269360412.png

1320922-20180619125612666-1333249414.png

1320922-20180619125637846-1764057579.png

3. 实验过程中遇到的问题和解决过程

  • 问题1:实验2中,一个小问题,输入中缀表达式,按回车后,在客户端转后缀的时候出现了问题:

  • 问题1解决过程:经过几次实验,发现了导致这个奇怪现象的原因。现在来回顾一下我当时的操作:我们的中缀转后缀表达式,需要在操作数与操作符之间留有空格,以便调用Stringtokenizer方法经行分割、计算。然而事实上我也是那么做的,但是细节就是:我按照顺序一个操作数,空格,一个操作符地输入,但是突然我就少输入了一个空格,于是我就用键盘上地移动键将光标移动到操作符与操作数之间,然后敲上空格,然后回车。于是。。。就错了,是的,我应该再把光标移动到最后一个输入的字符后面回车地。。。

  • 问题2:实验3中,传输的后缀表达式到服务器端显示的是一串乱码。。。

  • 问题2解决过程:原本代码写的是outputstreamwriter,但是它只能传输字符串类型数据,所以把输出改成字节流的outputstream,即可输出字节类型

  • 问题3:实验4中,首先感到疑惑的是,要产生密钥,需要自己的私钥和对方的公钥进行合成,这就涉及到一个问题:如何将自己(客户端)的公钥传给服务器。按照娄老师的博客已经给出的代码,我们可以做到把生成的密钥存放进文件当中并读取,但是做不到把文件传给服务器。然后又出现的一个问题是,如图:
    1320922-20180619200632969-1748544790.png
    额,这是借来的图。。。但是问题是一样的,提示密钥长度,还有wrong key size。

  • 问题3解决过程:虽然我们可以从文件中读取出密钥来,但是首先还是得有对方的公钥啊,那如何获得呢?代码也不会写。。。所以我们选择充分利用现代科学技术。。。利用腾讯QQ进行文件传输。对于后面的那个密钥长度问题,百度了一下DES算法,它的密钥长度是168位的,但是只有112位有效。而AES算法256位。所以做出如图的修改:
    1320922-20180619201239661-634622546.png
    代码中AES的密钥长度设置也要改成256,再运行一下就OK了。

  • 问题4:实验5中,遇到的问题本应该在实验四中就出现,但是我们用了QQ传递文件从而避免了这个问题,那就是:如何从客户端发送多条消息给服务器,并让其成功接受

  • 问题4解决过程:
    这个问题很难解决。主要是不知道如何去传,如何去收。百度了一下这个问题:主要是涉及到了多线程的问题。客户端发送一条数据给服务器,服务器直接收就行了,但是如果要再发一条呢?客户端再写一条一样的发送语句?那服务器端如何识别呢?怎么识别、接受呢?关于这个问题网上虽然也有一些介绍,但是资源有限,尝试了一些可能的看得懂的代码。按道理来说应该是行得通的,但是IDEA总是提示错误,这个错误也看不懂,不理解。而且服务器也收不到两条数据,甚至第一条也没了。
    于是,我们换了条思路,把两条数据(密文和明文的MD5值)都写进一条传输的语句当中,然后在服务器端,把前面的密文都出来保存起来,把后面的MD5值读出来保存起来。这样算是解决了这个实验当中的关键部分。

  • 问题5:实验五当中还出现了一个十分神奇的现象,如图:
    1320922-20180619204155499-1561242661.png
    本应该出现密文的地方,出现了如上图所示的一长串相同的数字。这个是真的绝望。。。

  • 问题5产生的分析(解决不了。。。):我们当时的做法就是像问题4中说的那样,把两条数据都写在一个输出语句中。但这样就有两种做法:一是把字节型的密文转换成字符串类型;二是把字符串类型的MD5值写进存放密文的字节数组。我们选择了前者,于是我们写了一个循环,把字节数组里的数据都作为字符串类型,一个一个输出出来了,但是最后导致的问题就是如问题5所叙述的那样,客户端输出的结果是正确无误的,但是传到服务器端之后,显示出来的就是如上图所示的那个鬼样子。。。后来实在出于无奈,解决不了这个问题(只好放弃了),就换了第二种做法。最终做出了结果。

参考资料

转载于:https://www.cnblogs.com/zhouyajie/p/9198015.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java程序设计》课程实验指导书程序代码(答案)(实验Java的异常处理),个人原创,仅供参考与交流。 希望多多交流,共同进步! 实验 Java的异常处理 一、实验目的: 理解 java 语言中独特的异常处理机制; 掌握异常处理方法; 正确地使用捕获异常和声明抛弃异常的两种异常处理的方法; 了解自定义异常类的使用; 理解抛出异常和声明抛出异常的区别与联系; 二、实验内容: 1. 从命令行得到5个整数,放入一整型数组,然后打印输出,要求:如果输入数据不为整数,要捕获Integer.parseInt()产生的异常,显示“请输入整数”,捕获输入参数不足5个的异常(数组越界),显示“请输入至少5个整数”。 2.写一个方法void sanjiao(int a,int b,int c),判断三个参数是否能构成一个三角形,如果不能则抛出异常IllegalArgumentException,显示异常信息a,b,c+”不能构成三角形”,如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数,调用此方法,并捕获异常。 3.自定义类Sanj,其中有成员 x,y,z,作为三边长,构造方法Sanj(a,b,c)分别给x,y,z赋值,方法求面积getArea和显示三角形信息(三个边长)showInfo,这2个方法中当三条边不能构成一个三角形时要抛出自定义异常NotSanjiaoException,否则显示正确信息。在另外一个类中的主方法中构造一个Sanj对象(三边为命令行输入的三个整数),显示三角形信息和面积,要求捕获异常。 三、实验要求: 1. 通过实验掌握捕获异常和声明抛弃异常的两种异常处理的方法; 2. 程序必须能够捕获Integer.parseInt()产生的异常并作相应的处理; 3. 程序必须能够将处理的相应的信息输出出来; 4. 写出实验报告。要求记录编译和执行Java程序当中的系统错误信息提材示,并给出解决办法。(附运行界面、源代码)。 四、实验步骤: 1. (第1题) 使用try…..catch…. finally语句对Integer.parseInt()产生的异常进行捕获处理; 2. (第2题) 定义方法void sanjiao(int a,int b,int c)中,不符合条件则抛出异常(if a+b<=c(或a+c<=b,b+c<=a) then throw new IllegalArgumentException(),),再定义main方法,调用此方法,用try…..catch…. finally语句并捕获异常; 3. (第3题) 定义三角形类及相应的方法, 在定义的方法中对不符合条件则抛出异常(如上题) ,再定义main方法,对正确的数据输出正确信息,否则捕获异常; 、自做实验 1.参考下面的程序,试修改程序,捕获相关异常,使得程序能正常运行。[提示:用错误数据测试,即可得到异常类名,运行时主方法参数输入 abc 测试] public class StringIndexOutOf{ public static void main(String args[]){ System.out.println("字符串索引越界异常"); String str=args[0]; System.out.println(“第四个字符为 ”+str.charAt(3)); int aa=Integer.parseInt(args[0]); System.out.println(“平方为 ”+aa*aa); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值