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


    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的问题,解决成功。

    其他(感悟、思考等)

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

    参考资料

  • 相关阅读:
    Learning to Compare: Relation Network for Few-Shot Learning 论文笔记
    修改python import模块中的变量
    roslaunch保存的log文件没有打印的ERROR信息
    python json demo
    vscode 1.32.x按下鼠标左键无法拖曳选择,而旧一点的版本1.30.2可以
    java-ee--------jdbc
    集合
    关键字
    java面向对象
    数组
  • 原文地址:https://www.cnblogs.com/zhaopeining/p/11628656.html
Copyright © 2020-2023  润新知