20202303 实验四 《数据结构与面向对象程序设计》实验报告

# 20202303 2021-2022-1 《数据结构与面向对象程序设计》实验三报告

课程:《程序设计与数据结构》
班级: 2023
姓名: 马澜
学号:20202303
实验教师:王志强
实验日期:2021年10月11日
必修/选修: 必修

## 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. 实验过程及结果

(一)Java Socket编程

   也就是编写服务器与客户端,在这里我选择了20202322袁艺匀为伙伴,我负责B部分,她负责A部分。

   运行如图所示

    双方进行了完美的对接。

(二)Java和密码学

这个对于本人还是有一定难度的,好在有例子文件,探究的话也不至于很费解。这个部分总共有四个板块

1.首先要进行凯撒密码的尝试,并进行加密解密。如图

 

 在加密解密时,尤其是要注意利用正负号去显示明文与密文

 

 2.Java对称加密-DES算法

首先将密钥经过对象序列化方式保存在文件中,然后打印密码编码的内容,接着使用对称密钥进行加密和解密,最后对SEnc.dat中的密文进行解密,获得明文。

 

 

 

 3.Java非对称加密算法-RSA算法

   首先获取公钥及参数,加密"Hello World!",计算密文并打印,然后使用私钥文件Skey_RSA_priv.dat,对密文文件Enc_RSA.dat中的密文c进行解密,得到明文"Hello World!"操作很简单

 

 

 

 4.使用密钥协定创建共享密钥

  首先创建DH公钥和私钥,创建共享密钥并打印。创建过程其实也不太懂。不过有三个程序就可。

 

 

对于Java摘要算法- MD5

(三)编写有理数/复数计算器

结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。

对于我自己是B任务,所以编写复数计算器。

 

import java.util.Scanner;
public class MyComplex {
private double realpart; // 实部
private double imaginpart; // 虚部
public MyComplex ( double realpart, double imaginpart) {//有参构造
super();
setimaginpart(imaginpart);
setrealpart(realpart);
}
public MyComplex () {//无参
super();
realpart=0;
imaginpart=0;
}
public double getrealpart() {
return realpart;
}
public void setrealpart(double real) {
realpart = real;
}
public double getimaginpart() {
return imaginpart;
}
public void setimaginpart(double imag) {
imaginpart= imag;
}
public static MyComplex MyComplexAdd( MyComplex a, MyComplex b){//复数加法 a+b
double n=a.imaginpart+b.imaginpart;
double m=a.realpart+b.realpart;
MyComplex result=new MyComplex (m,n);
return result;
}
public static MyComplex MyComplexSub( MyComplex a, MyComplex b){//复数减法 a-b
double m=a.realpart-b.realpart;
double n=a.imaginpart-b.imaginpart;
MyComplex result=new MyComplex (m,n);
return result;
}
public static MyComplex MyCompleMul( MyComplex a, MyComplex b){//复数 乘法 a*b
double m=(a.realpart*b.realpart)-(a.imaginpart*b.imaginpart);
double n=(a.realpart*b.imaginpart)+(a.imaginpart*b.imaginpart);
MyComplex result=new MyComplex (m,n);
return result;
}
public static MyComplex MyCompleDiv( MyComplex a, MyComplex b){//复数除法 a/b
double c=b.realpart*b.realpart+b.imaginpart*b.imaginpart;
double n=(a.realpart*b.realpart)/c;
double m=a.imaginpart*(-1)*(b.imaginpart)/c;
MyComplex result=new MyComplex (m,n);
return result;
}
public static void playMyComplex ( MyComplex c){//输出复数
System.out.println(c.realpart+"+"+c.imaginpart+"i");
}
@Override
public boolean equals(Object o){//重写Object 的equals(Object obj)判断两个复数是否相等
if(o==null){
return false;
}else if(o instanceof MyComplex){
MyComplex myComplex=(MyComplex)o;
if(myComplex.realpart==this.realpart&&myComplex.imaginpart==this.imaginpart){
return true;
}else
return false;
}
return false;
}
public static void main(String []args){
Scanner input1 = new Scanner(System.in);
Scanner input2 = new Scanner(System.in);
Scanner input3 = new Scanner(System.in);
Scanner input4 = new Scanner(System.in);
System.out.println("请输入第一个复数实部:");
int m = input1.nextInt();
System.out.println("请输入第一个复数虚部:");
int l = input2.nextInt();
System.out.println(" ");

System.out.println("请输入第二个复数实部:");
int s = input3.nextInt();
System.out.println("请输入第二个复数虚部:");
int f = input4.nextInt();
System.out.println(" ");

MyComplex a=new MyComplex(m,l);
MyComplex b=new MyComplex(s,f);
System.out.print("复数a: ");
MyComplex.playMyComplex(a);
System.out.print("复数b: ");
MyComplex.playMyComplex(b);
System.out.print("a+b:");
MyComplex result=MyComplex.MyComplexAdd(a, b);
MyComplex.playMyComplex(result);
System.out.print("a-b:");
result=MyComplex.MyComplexSub(a, b);
MyComplex.playMyComplex(result);
System.out.print("a*b:");
result=MyComplex.MyCompleMul(a, b);
MyComplex.playMyComplex(result);
System.out.print("a/b:");
result=MyComplex.MyCompleDiv(a, b);
MyComplex.playMyComplex(result);
a=new MyComplex(m,l);
b=new MyComplex(s,f);
System.out.print("复数a: ");
MyComplex.playMyComplex(a);
System.out.print("复数b: ");
MyComplex.playMyComplex(b);
System.out.println("a==b:"+(a==b));
System.out.println("a.equals(b):"+a.equals(b));
}
}

(四)远程有理数计算器

结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。

    我是B任务,所以要写根据有理数计算器结果,传给客户端A

 

 

 

(五)远程复数计算器

结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。

    我自己是B任务,所以要以客户端的身份给出复数式子,最后A返回给我结果。

 

 

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

 - 问题1:在第一次建立服务器和客户端程序的编写时,两个人出了各种问题,端口数字没对齐,而且电脑自己上才能联动,两台电脑不能连接。
- 问题1解决方案:首先对齐端口,然后连接同一个网络,搜索自己的ip,就命,把localhost换成了另一个链接,如下

 然后也不能连接上,最后请教老师,防火墙没有关来着。在老师的指导下最后成功联动。

 - 问题2:在密码学的自学上,最后一个出现了问题,不会建立pri与pub文件,而且博客上没有详细说明。

- 问题2解决方案:我自己从网上搜索是没有的,在偶然的条件下发现一种办法,试了一下,真的可以,如下

 

## 其他(感悟、思考等)

        在本次实验中,我感觉有点难度,直呼好菜。最让我“印象深刻”的就是有密码学了。它的难点在于文章很长,也很琐碎,需要耐心和搜查资料的坚定。所以我们也要具备一定的自学能力。还有在IDEA中发现了新大陆,原来可以梦幻联动,实现两台电脑的交流,我觉得真的是比较有意思,实践往往比较理论艰难一点,所以很快发现自己的不足,这给我带来的感悟就是,光课上汲取知识是远远不够的,课下的自学与努力也是必要的。


-  [《Java程序设计与数据结构教程(第九版)》]

-https://www.cnblogs.com/rocedu/p/6683948.html

posted @ 2021-10-24 18:43  20202303马澜  阅读(52)  评论(0编辑  收藏  举报