20182301 2019-2020-1 《数据结构与面向对象程序设计》实验4报告

课程:《程序设计与数据结构》
班级: 1823
姓名: 赵沛凝
学号:20182301
实验教师:王志强
实验日期:2019年9月23日
必修/选修: 必修

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码云。
  • 注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!

2. 实验过程及结果

本次实验要求和学习伙伴进行学习,但是由于十一假期,所以先是进行自己学习,然后再互相讨论学习

第一个

我一开始对此感到困扰,但是我慢慢了解后,我逐渐开始喜欢它,并慢慢了解

  • 服务器端:
  1. 建立一个服务器Socket绑定指定的端口并开始监听;
  2. 使用accept()方法阻塞等待监听,获取新的连接;
  3. 建立输入和输出流;
  4. 在已有的协议上产生会话;
  5. 使用close()方法关闭流和Socket;
  • 客户端:
  1. 建立客户端Socket连接,指定服务器的位置以及端口;
  2. 得到Socket的读写流;
  3. 利用流按照一定的协议对Socket进行读/写操作;
  4. 使得close()方法关闭流和Socket
  • 理解后,修改IP地址

第二个

  1. 根据老师分享的链接,进行学习。凯撒密码——对称密码——非对称(RSA)密码——分享密码——MD5密码
  2. 根据步骤一步一步,学习了如何输入命令行进行run(右上角:编辑)

第三个

我认为有理数与无理数的计算器有异曲同工之妙,在这里只详细操作有理数

  1. 我打算按照第五章中的RationalNumber进行改动操作,于是第一次,我尝试删除Test,只改动Number,但是并不成功。
  2. 第二次,我保留RationalNumber,重写Test,调动RationalNumber,该方法成功,但是遇到了问题,见第三部分。

第四、五个

  1. 远程操作,初步构想是将“服务器、客户端”与“有理数”进行套用。
  2. 明确客户端只能存在输入,不可调用Rational
  3. 思想是对的,但是细节需要反复验证,反复商讨。

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

  • 问题1:代码出现乱码情况,怎么办?

  • 问题1解决方案: 先用记事本打开,再进行复制粘贴

  • 问题2:按照步骤进行命令行编译,不能得出应有的结果

  • 问题2解决方案:询问助教和老师后,没能完全解决。但是我学到了:结果不重要,理解每一个步骤就好。认真学习后,进行下一个。
  • 问题3:在传递的过程中,我一开始想一个一个的将参数传递过去,但是出现了问题,不仅浪费资源,而且还只能传递一个数字

  • 问题3解决办法:于是我打算传递字符串过去,确实传递过去了。

  • 问题4:字符串传递过去后不知如何分解,以及分辨符号?

  • 问题4解决办法:百度了解到有方法:扫描字符串,stringtokenizer类
    本次使用的是toCharAyyay方法。具体见链接:https://www.cnblogs.com/rrttp/p/7922202.html

  • 问题5:Java编译错误:需要class,interface或enum,如何解决?

  • 问题5解决方法:

    • 这是Java文件的编码导致的,通常使用javac FirstSample.java编译UTF-8编码的.java源文件。没有指定编码参数encoding的情况下,默认使用的是GBK编码。
    • 当编译器用GBK编码来编译UTF-8文件时,就会把UTF-8编码文件的3个字节的文件头,按照GBK中汉字占2字节、英文占1字节的特性解码成了“乱码”的两个汉字。这个源文件应该是用记事本另存为UTF-8编码造成的。
    • 对于非GBK及其子集编码(GB2312)的源文件,编译方式为javac -encoding "UTF-8" FirstSample.java。但还是会出现错误,提示非法字节。
    • 这是因为.java只识别不带BOM的UTF-8编码。所以应该用EmEditor、Editplus、ULtraEdit或notepad++之类的工具另存为UTF-8(无BOM)。然后就可以用javac .java编译.java文件了。
  • 问题6:运行出现错误,调试也不可用。

  • 问题6解决方法:在把next改为nextLine后,可以进行调试,发现问题

于是修改为

  • 问题7:在运行后,不能得出正确答案,且答案距离正确答案较远?

  • 问题7解决办法:发现是ascll的问题,解决成功。

其他(感悟、思考等)

本次代码真的是特别难,好在国庆时间充裕,体会到把一个代码调试成功后的感觉真的很好,非常舒服。
以后也会认真学习的!

参考资料