实验四
20182334 2019-2020-1 《数据结构与面向对象程序设计》实验四报告
课程:《程序设计与数据结构》
班级: 1823
姓名: 姬旭
学号: 20182334
实验教师:王志强
实验日期:2019年9月30日
必修/选修: 必修
1.实验内容
(一)Java Socket编程
1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。
(二)Java和密码学
参考 http://www.cnblogs.com/rocedu/p/6683948.html
以结对的方式完成Java密码学相关内容的学习(帖子中所有代码和相关知识点需要学习)。提交学习成果码云链接和代表性成果截图,要有学号水印。
(三)编写有理数/复数计算器
结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。
(四)远程有理数计算器
结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
(五)远程复数计算器
结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
2. 实验过程及结果
本次实验实现远程连接,通过两台pc机实现聊天或者运算。
(1)Java Socket编程
本实验是和结对伙伴一起做的,首先实现连接,然后传送信息。
下图是服务器收到的信息:
下图是客户端收到服务器的信息:
(2)Java和密码学
本实验总共分为五步分:
凯撒密码
下图程序既可用于加密也可以用来解密。只要执行
java 文件名 明文(要加密的字符串) 密钥(移动的位数)
即加密完成。
在密钥前加上负号,运行
java 文件名 明文(要加密的字符串) -密钥(移动的位数)
即可解密。
Java对称加密-DES算法
(一)
运行下图则会生成文件key1.dat,其中包含的密钥可以用于使用Triple-DES算法的加密和解密。
上面的示例将密钥通过对象序列化方式保存在文件中,在文件中保存的是对象,本实例以另一种方式保存在文件中,即以字节保存在文件中。
(二)
程序中在保存了密钥编码后,又使用循环语句将字节数组中的内容打印出来。这样可以较为直观地看到密钥编码的内容。
(三)
屏幕中输出的数字:其中第一行为字符串"Hello World!"的字节数组编码方式,第二行为加密后的内容,第二行的内容会随着密钥的不同而不同。
密文同时保存在SEnc.dat文件中,将其提供给需要的人时,需要同时提供加密时使用的密钥(key1.dat,或keykb1.dat),这样收到SEnc.dat中密文的人才能够解密文件中的内容。
前面加密后的密文SEnc.dat,以及加密时所使用的密钥key1.dat或keykb1.dat,本实例对SEnc.dat中的密文进行解密,得到明文。
(四)
运行程序
当前目录下必须有前面生成的密钥文件keykb1.dat,以及密文文件SEnc.dat。
输入java SDec运行程序,将输出明文字符串“Hello World!”。
Java非对称加密-RSA算法
(一)
输入java Skey_RSA运行程序,当前目录下将生成两个文件:Skey_RSA_pub.dat和Skey_RSA_priv.dat,前者保存着公钥,后者保存着私钥。
(二)
输入java Enc_RSA运行程序,得到如下结果:
其中显示了公钥中的参数以及加密的结果c,这些都是很大的整数,n和c多达上百位。程序运行后密文c以字符串形式保存在文件Enc_RSA.dat中。
(三)
运行程序输入java Dec_RSA运行程序,得到如下结果
:
其中显示了私钥中的参数以及解密的结果,其中整型的明文转换后显示出字符串“Hello World!”。
使用密钥协定创建共享密钥
- 创建DH公钥和私钥
建立两个目录A和B,模拟需要秘密通信的A、B双方,由于DH算法需要A和B各自生成DH公钥和私钥,因此在这两个目录下都拷贝编译后文件Key_DH。
首先由A创建自己的公钥和私钥,即在A目录下输入
java Key_DH Apub.dat Apri.dat
运行程序,这时在目录A下将产生文件Apub.dat和Apri.dat,前者保存着A的公钥,后者保存着A的私钥。
然后由B创建自己的公钥和私钥,即在B目录下输入
java Key_DH Bpub.dat Bpri.dat
运行程序,这时在目录B下将产生文件Bpub.dat和Bpri.dat,前者保存着B的公钥,后者保存着B的私钥。
最后发布公钥,A将Apub.dat拷贝到B目录,B将Bpub.dat拷贝到A的目录。
这样,A、B双方的DH公钥和私钥已经创建并部署完毕。
将程序KeyAgree编译后分别拷贝在A和B两个目录,首先在A目录输入
java KeyAgree Bpub.dat Apri.dat
运行程序,它使用文件Bpub.dat中对方的公钥和文件Apri.dat中自己的私钥创建了一段共享的字节数组。
Java摘要算法- MD5
输入
java DigestCalc abc
来运行程序,其中命令行参数abc是原始数据,屏幕输出计算后的消息摘要:93f725a07423fe1c889f448b33d21f46。
(3)编写有理数/复数计算器
结对对象写复数计算器,我写有理数计算器,
(4)远程有理数计算器
在有理数计算器中,写了Rational类,script类,之后嵌套连接,最后互相传输信息。
(5)远程复数计算器
在复数计算器中 ,传输信息,编写hello类,完成信息处理。
3. 实验过程中遇到的问题和解决过程
-
问题1:在实验一中,无论怎样都无法连接对方,很头疼。
-
问题1解决方案:利用cmd命令查找本机ip地址
再用ipconfig命令查找ip
-
问题2:按照问题一的方法找了ip地址,但输上去还是不管用,
-
问题2解决方案:仔细观察cmd命令发现自己找的是以太网的ip地址,但电脑没有连网线,而是连的WiFi,找到无线局域网的ip地址之后再连接就OK啦
-
问题3:无法打出printl。
-问题3解决方案:一开始我以为是没有class文件,因为以前就遇到过这种问题,但我仔细看有class,于是和迷茫,询问结对伙伴才知道自己多打了个括号:
- 问题4:在写第二个实验的时候总是出现以下问题:
很棘手,也不知如何解决。
-
问题4解决方案:找助教学姐问了问,得到的回答是需要在命令行调试的地方输入值,这里引用个博客:IDEA如何输入命令行参数,完美的解决了我的问题
-
问题5:不明白以下代码的含义:
outputStreamWriter.write(info1);
outputStreamWriter.flush();
outputStreamWriter.write(info2);
outputStreamWriter.flush();
outputStreamWriter.write(s);
outputStreamWriter.flush();
scoket.shutdownOutput();
-
问题5解决方案:查看Java中OutputStreamWriter类的常用方法这篇博客。
write是构造一个输出流对象,大致意思是向服务器推送一条信息。 -
问题6:
info1 = bufferedReader.readLine();
其中的bufferedReader我不明白
- 问题6解决方案:JavaIO BufferedReader和BufferedWriter介绍和实例查看了这个博客,发现了很多不一样的东西,也解决了很多在实验四和实验五遇到的问题。
其他(感悟、思考等)
这个实验颠覆了我对自学的看法,说起自学很简单,但操作起来,是真的要命,无论是遇到自己见都没见过的知识点,还是自己要动手敲一个很棘手的代码,都困难重重,这个实验我和结对伙伴打了将近3天,才基本处理完毕,还有很多不足没有改进,代码中的漏洞也还很多,在实验完成后还要继续修正,修复bug。自己要学的东西还有很多,自己面临的知识盲区也无穷无尽,每多打一部分代码,就会发现自己原来知道的是那么少,九牛一毛都觉得多。随着学习的深入,懂得越多,但又发现自己懂的是那么的少,产生矛盾。
参考资料
- 《Java程序设计与数据结构教程(第二版)》
- 《Java程序设计与数据结构教程(第二版)》学习指导
- 《实验二 Java面向对象程序设计》
- JavaIO BufferedReader和BufferedWriter介绍和实例
- Java中OutputStreamWriter类的常用方法
- IDEA如何输入命令行参数