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


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
课程:《程序设计与数据结构》
班级: 1923
姓名: 张源峰
学号:20192311
实验教师:王志强
实验日期:2020年10月8日
必修/选修: 必修

实验内容

(一)Java Socket编程
1.学习蓝墨云上教材《Java和Android编程》“第16章
输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java
,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰
写实验报告。
(二)Java和密码学
参考 http://www.cnblogs.com/rocedu/p/6683948.htm
l
以结对的方式完成Java密码学相关内容的学习(帖子中
所有代码和相关知识点需要学习)。提交学习成果码云
链接和代表性成果截图,要有学号水印。
(三)编写有理数/复数计算器
结对编程,结对伙伴A编写有理数计算器。结对伙伴B编
写复数计算器。截图加水印上传蓝墨云,代码push码云

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

课程:《程序设计与数据结构》 班级: 1923 姓名: 张源峰 学号:20192311 实验教师:王志强 实验日期:2020年10月8日 必修/选修: 必修

实验内容

(一)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码云。

内容一

结对伙伴代码 20192329客户端 import java.io.*; import java.net.Socket; public class SocketDemo1 { public static void main(String[] args) throws IOException {

Socket socket = new Socket("192.168.3.17",8800);
// Socket socket = new Socket("172.16.43.187",8800); OutputStream outputStream = socket.getOutputStream(); // PrintWriter printWriter = new PrintWriter(outputStream); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

String info1 = "OK";

outputStreamWriter.write(info1);
outputStreamWriter.flush();
socket.shutdownOutput();
String reply = null;
while (!((reply = bufferedReader.readLine()) ==null)){
    System.out.println("Ҵ" +  reply);
}

bufferedReader.close();
inputStream.close();
outputStreamWriter.close();
outputStream.close();
socket.close();

}
} 服务器端20192311 import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SocketClient { public static void main(String[] args) throws IOException {

ServerSocket serverSocket=new ServerSocket(8800);

Socket socket=serverSocket.accept();

InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));

OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);

String info=null;
System.out.println("收到,这就买饭");
while(!((info = bufferedReader.readLine()) ==null)){
    System.out.println("给钱" + info);
}
String reply="给钱";
printWriter.write(reply);
printWriter.flush();
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
serverSocket.close();

}
}

内容二

Java对称加密-DES算法

对称密钥的生成和保存 编程思路: (1) 获取密钥生成器 (2) 初始化密钥生成器 (3) 生成密钥 (4) 通过对象序列化方式将密钥保存在文件中 分析:ObjectOutputStream类中提供的writeObject方法可以将对象序列化,以流的方式进行处理。这里将文件输出流作为参数传递给ObjectOutputStream类的构造器,这样创建好的密钥将保存在文件key1.data中。

import java.io.; import javax.crypto.; public class Skey_DES{ public static void main(String args[]) throws Exception{ KeyGenerator kg=KeyGenerator.getInstance("DESede"); kg.init(168); SecretKey k=kg.generateKey( ); FileOutputStream f=new FileOutputStream("key1.dat"); ObjectOutputStream b=new ObjectOutputStream(f); b.writeObject(k); } } 运行java Skey_DES,在当前目录下将生成文件key1.dat,其中包含的密钥可以用于使用Triple-DES算法的加密和解密。 (1) 获取密钥 (2) 获取主要编码格式 (3) 保存密钥编码格式 import java.io.; import java.security.; public class Skey_kb{ public static void main(String args[]) throws Exception{ FileInputStream f=new FileInputStream("key1.dat"); ObjectInputStream b=new ObjectInputStream(f); Key k=(Key)b.readObject( ); byte[ ] kb=k.getEncoded( ); FileOutputStream f2=new FileOutputStream("keykb1.dat"); f2.write(kb); // 打印密钥编码中的内容 for(int i=0;i<kb.length;i++){ System.out.print(kb[i]+","); } } } 输入java Skey_kb 运行程序,在程序的当前目录中将产生文件名为keykb1.dat的文件, (1) 从文件中获取密钥 (2) 创建密码器(Cipher对象) (3) 初始化密码器 (4) 获取等待加密的明文 (5) 执行加密 (6) 处理加密结果 import java.io.; import java.security.; import javax.crypto.; public class SEnc{ public static void main(String args[]) throws Exception{ String s="Hello World!"; FileInputStream f=new FileInputStream("key1.dat"); ObjectInputStream b=new ObjectInputStream(f); Key k=(Key)b.readObject( ); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); for(int i=0;i<ptext.length;i++){ System.out.print(ptext[i]+","); } System.out.println(""); byte ctext[]=cp.doFinal(ptext); for(int i=0;i<ctext.length;i++){ System.out.print(ctext[i] +","); } FileOutputStream f2=new FileOutputStream("SEnc.dat"); f2.write(ctext); } } 输入java SEnc运行程序,在程序的当前目录中将产生文件名为SEnc.dat的文件 (1) 获取密文 (2) 获取密钥 (3) 创建密码器(Cipher对象) (4) 初始化密码器 (5) 执行解密 import java.io.; import java.security.; import javax.crypto.; import javax.crypto.spec.*; public class SDec{ public static void main(String args[]) throws Exception{ // 获取密文 FileInputStream f=new FileInputStream("SEnc.dat"); int num=f.available(); byte[ ] ctext=new byte[num];
f.read(ctext); // 获取密钥 FileInputStream f2=new FileInputStream("keykb1.dat"); int num2=f2.available(); byte[ ] keykb=new byte[num2];
f2.read(keykb); SecretKeySpec k=new SecretKeySpec(keykb,"DESede"); // 解密 Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.DECRYPT_MODE, k); byte []ptext=cp.doFinal(ctext); // 显示明文 String p=new String(ptext,"UTF8"); System.out.println(p); } } 程序中最后将明文生成字符串加以显示。

运行程序

当前目录下必须有前面生成的密钥文件keykb1.dat,以及密文文件SEnc.dat。

输入java SDec运行程序,将输出明文字符串“Hello World!”。

内容三

有理数计算器 import java.util.Scanner; public class youli{ public static void main(String[] args) { double a,b,c=0; char d; char char1; Scanner scan = new Scanner(System.in); do {

System.out.println("请输入第一个有理数");
a = scan.nextInt();
System.out.println("请输入第二个有理数");
b = scan.nextInt();
System.out.println("第一个有理数: " + a);
System.out.println("第二个有理数 " + b);
System.out.println("请输如要运算的符号:");
char1 = scan.next().charAt(0);
switch (char1) {
case '+':
c = a+b;
break;
case '-':
c = a-b;
break;
case '':
c = a
b;
break;
case '/':
c = a/b;
break;
default:
break;
}
System.out.println("a" + char1 + "b = " + c);
System.out.println("是否继续?是输入Y否输入N");
d= scan.next().charAt(0);
}while(d=='Y');
}
}

内容四

结对伙伴代码 20192329客户端 package Extands1923;

import java.io.*; import java.net.Socket;

public class SocketDemo1 { public static void main(String[] args) throws IOException {

Socket socket = new Socket("192.168.3.17",8874);

OutputStream outputStream = socket.getOutputStream();

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);

InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

String info1 = "OK";

outputStreamWriter.write(info1);
outputStreamWriter.flush();
socket.shutdownOutput();
String reply = null;
while (!((reply = bufferedReader.readLine()) ==null)){
    System.out.println("5 + 3 =" +  reply);
}

bufferedReader.close();
inputStream.close();
outputStreamWriter.close();
outputStream.close();
socket.close();

}
} 20192311服务器端代码 import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.util.Scanner; import java.io.*; import java.net.ServerSocket; import java.net.Socket;

/**

Created by besti on 2019/9/29. */ public class Socket1 { public static void main(String[] args) throws IOException { double reply = 0; ServerSocket serverSocket = new ServerSocket(8874);

Socket socket = serverSocket.accept();

InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);

String info = null;
ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript");
String str = info;
Double d = 0.0;
try {
d = (Double) se.eval(str);
System.out.println(d);
} catch (ScriptException e) {
e.printStackTrace();
}
reply = d ;
while (!((info = bufferedReader.readLine()) == null)) {
System.out.println(reply);
}

printWriter.write(String.valueOf(reply));
printWriter.flush();

printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
serverSocket.close();
} }

内容五

反过来 20192311客户端 import java.io.; import java.net.Socket; public class SocketClient3 { public static void main(String[] args) throws IOException { //1.建立客户端Socket连接,指定服务器位置和端口 Socket socket = new Socket("192.168.3.18",8180); //2.得到socket读写流 OutputStream outputStream = socket.getOutputStream(); // PrintWriter printWriter = new PrintWriter(outputStream); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); //输入流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8")); //3.利用流按照一定的操作,对socket进行读写操作 String info1 = " 4 * 5 "; // String info = new String(info1.getBytes("GBK"),"utf-8"); // printWriter.write(info); // printWriter.flush(); outputStreamWriter.write(info1); outputStreamWriter.flush(); socket.shutdownOutput(); //接收服务器的响应 String reply = null; while (!((reply = bufferedReader.readLine()) ==null)){ System.out.println("接收服务器的信息为:" + reply); } //4.关闭资源 bufferedReader.close(); inputStream.close(); outputStreamWriter.close(); //printWriter.close(); outputStream.close(); socket.close(); } } 结对伙伴服务器端代码 20192329 import java.io.; import java.net.ServerSocket; import java.net.Socket; import java.util.StringTokenizer;

public class qwq {

private static Complex cplx1;
private static Complex cplx2;
private static String a,b;
private static char ch;
private static Complex result = null;

public static void main(String[] args) throws IOException {

ServerSocket serverSocket=new ServerSocket(8180);

Socket socket=serverSocket.accept();

InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));

OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);

String info=null;
System.out.println("服务器已经建立......");
while(!((info = bufferedReader.readLine()) ==null)) {
    System.out.println("我是服务器,用户信息为:" + info);


    StringTokenizer st = new StringTokenizer(info, " ", false);
    a = st.nextToken();
    ch = st.nextToken().charAt(0);
    b = st.nextToken();
    cplx1 = new Complex(a);
    cplx2 = new Complex(b);

    switch (ch) {
        case '+':
            result = cplx1.ComplexAdd(cplx2);

            break;
        case '-':
            result = cplx1.ComplexSub(cplx2);

            break;
        case '*':
            result = cplx1.ComplexMulti(cplx2);

            break;
        case '/':
            result = cplx1.ComplexDiv(cplx2);
            break;
        default:
            break;
    }
}

//给客户一个响应
String reply=cplx1+String.valueOf(ch)+cplx2+"="+result;
printWriter.write(reply);
printWriter.flush();
//5.关闭资源
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
serverSocket.close();

}
} 实验过程中遇到的问题和解决过程 问题:内容一服务器与客户端没有顺利连接 解决方法:更换热点更改地址 参考资料 《Java程序设计与数据结构教程(第二版)》

《Java程序设计与数据结构教程(第二版)》学习指导书

posted @ 2020-10-29 09:05  20192311张源峰  阅读(142)  评论(1编辑  收藏  举报