20172303 2017-2018-2 《程序设计与数据结构》实验五报告
20172303 2017-2018-2 《程序设计与数据结构》实验五报告
- 课程:《程序设计与数据结构》
- 班级: 1723
- 姓名: 范雯琪
- 学号:20172303
- 实验教师:王志强
- 助教:张旭升/刘伟康
- 实验日期:2018年6月13日
- 必修/选修: 必修
实验内容
- 任务一:实现中缀转后缀并计算结果的功能
- 参考数据结构应用
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
- 任务二:基于Java Socket实现客户端/服务器功能
- 一人负责客户端,一人负责服务器
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 任务三:基于任务二,使用3DES或AES算法将后缀表达式进行加密
- 一人负责客户端,一人负责服务器
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 任务四:基于任务三,使用DH进行密钥交换
- 一人负责客户端,一人负责服务器
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 任务五:基于任务四,使用MD5将明文加密
- 一人负责客户端,一人负责服务器
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
实验过程及结果
任务一
过程
因为在之前的结对编程中已经实现了这两个功能,并且老师说可以直接使用,我就直接使用了之前的InfixToSuffix
类和Calculator
类进行中缀转后缀和计算,在ArithmeticTest
类中添加代码后实现。
运行结果
任务二
原理
TCP协议
- TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流。
- 发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
- TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽
Java.net.Socket
- 此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
套接字的实际工作由SocketImpl
类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。 - java在包
java.net
中提供了两个类Socket
和ServerSocket
,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。 - 构造方法
其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可 以用来创建Socket。count则表示服务端所能支持的最大连接数。例如:
Socket client = new Socket("127.0.01.", 80);ServerSocket server = new ServerSocket(80);
- 注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
过程
- 使用
ipconfig
在cmd中查看自己的IP地址,要注意的是,在创建Socket的时候,如果是和结对伙伴的话,host
要填结对伙伴的IP,而如果是自己既做客户端又做服务器时,host
可以填127.0.0.1或localhost。
- 客户端
- 创建Socket
//1.建立客户端Socket连接,指定服务器位置和端口Socket socket = new Socket("172.16.43.217",8800);
- 打开连接到Socket的输入流
//2.得到socket读写流 OutputStream outputStream = socket.getOutputStream(); PrintWriter(outputStream); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); //输入流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
- 按照一定的协议对Socket进行读/写操作
Scanner scanner = new Scanner(System.in); System.out.println("请输入计算式:(以空格隔开每个运算符和运算数)"); String expr = scanner.nextLine(); InfixToSuffix infixToSuffix = new InfixToSuffix(); infixToSuffix.conversion(expr); System.out.println("我传送给服务器的信息为:"+infixToSuffix.getMessage()); String info = new String(infixToSuffix.getMessage().getBytes("utf-8")); outputStreamWriter.write(info); outputStreamWriter.flush(); socket.shutdownOutput(); //接收服务器的响应 String reply = null; while (!((reply = bufferedReader.readLine()) == null)){System.out.println("接收服务器的信息为:" + reply); }
- 关闭Socket
bufferedReader.close(); inputStream.close(); outputStreamWriter.close(); outputStream.close(); socket.close();
- 服务器
- 服务器部分是我的结对伙伴完成的,这里放他的码云链接,其大致过程仍然是:
- 创建Socket
- 打开连接到Socket的输入/出流
- 按照一定的协议对Socket进行读/写操作
- 关闭Socket
运行结果
任务三
原理
DES加密算法
- DES加密是一种对称加密算法,它是分组密钥的代表算法,算法和密钥都需要良好的加密。
- 实现DES对称密钥的步骤有三步:
- 生成对称密钥;
- 使用对称密钥进行加密和解密;
- 从文件中获取加密时使用的密钥,使用密钥进行解密。
- 关键代码
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);
过程
- 刚开始我们在任务二的基础上进行代码增加,但是在运行时服务器端显示的是乱码,后来发现是因为传输的格式有问题,娄老师的博客里给的解密方式解密的必须是byte数组,之后我们就想办法把传过来的信息的格式改成byte数组,但是尝试了很多次都失败了。
- 而在在上网查的时候发现一篇博客中java的OutputStream.writeUTF()函数介绍了另一种方法:
DataOutputStream/DataInputStream
,其中有一个方法叫wrtieUTF
,它将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节。使用这个方法,在传输之后转化成byte数组就很方便了。
- 客户端
- 服务器
运行结果
任务四
原理
DH算法
- 在DH算法中,主要数据通过对称密钥加密,而使用非对称加密来分发对称密钥,这样就将两者的优势结合了起来。
- DH算法是建立在DH公钥和私钥的基础上的,A需要和B共享密钥时,A和B各自生成DH公钥和私钥,公钥对外公布而私钥各自秘密保存。
过程
- 1.修改原先的
key_DH
类和keyAgree
类中的main方法,使其能够被引用。
- 2.创建DH公钥和私钥,将生成的公钥文件传给对方
客户端
服务器
运行结果
任务五
原理
- 使用Java计算指定字符串的消息摘要。java.security包中的MessageDigest类提供了计算消息摘要的方法。
- 运行代码
String x=args[0];MessageDigest m=MessageDigest.getInstance("MD5");m.update(x.getBytes("UTF8"));byte s[ ]=m.digest( );String result="";for (int i=0; i<s.length; i++){result+=Integer.toHexString((0x000000ff & s[i]) |
0xffffff00).substring(6);}System.out.println(result);
过程
在任务四的代码基础上将运行代码加入即可。
- 客户端
- 服务器
运行结果
实验过程中遇到的问题和解决过程
- 问题1:在第一次运行Socket时抛出IOException错误。
问题1解决方法:通过在网上查找发现这个错误好像是避免不了的,必须进行捕获或者抛出。
在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。
- 问题2:在传输的过程中产生错误
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
- 问题2解决方法:通过翻译,产生的原因应该是因为服务器和客户端产生的密钥不同,在把我的密钥文件复制给他之后就解决了问题。
- 问题3:在任务三传输的过程中,传输过去的一直显示的是乱码
问题3解决方法:在刚刚的任务三的实验过程中有写到,我们找到了另外一种方法来解决这个问题。
其他(感悟、思考等)
本学期的最后一次实验了,感觉java socket真的非常有意思,最后悔的是当时实验三的最后一个节点做的不是很好,所以这回又去复习了半天密码学的相关内容。
回顾一个学期的内容发现自己真的学到了很多,很开心。
下学期继续加油。
参考资料
- java socket编程
- Java 密码学算法
- readUTF()和writeUTF()
转载于:https://www.cnblogs.com/PFrame/p/9201110.html
20172303 2017-2018-2 《程序设计与数据结构》实验五报告相关推荐
- 20162329 张旭升 2017 - 2018 《程序设计与数据结构》第五周总结
20162329 2017-2018-1 <程序设计与数据结构>第五周学习总结 教材学习内容总结 1.学习目标 了解集合的概念 了解并使用抽象数据类型 初步了解使用Java泛型 学习栈这种 ...
- 20172329 2017-2018-2 《程序设计与数据结构》实验五报告
这是这学期最后一次实验了,也是学到了很多东西,希望自己可以可以善始善终,加油! 让我们开始这一篇博客吧! 20172329 2017-2018-2 <程序设计与数据结构>实验五报告 课程: ...
- #《JAVA程序设计》 20155214 实验五 网络编程与安全
<JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...
- 计算机实验 进程同步实验观察结果记录表,北京理工大学计算机实验五报告表.doc...
北京理工大学计算机实验五报告表.doc (2页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 实验五 实验报告表实验名称:学号: 姓名: ...
- 20202413 2022-2023-2 《网络与系统安全技术》实验五报告
20202413 2022-2023-2 <网络与系统安全技术>实验五报告 文章目录 20202413 2022-2023-2 <网络与系统安全技术>实验五报告 1.实践内容 ...
- 计算机组成原理第五个实验,计算机组成原理实验五报告.docx
计算机组成原理实验五报告 实 验 报 告课 程计算机组成原理姓 名学 号实验项目微程序控制单元实验同组姓名学 号指导教师专业班级计算机科学与技术09实验时间2011-6-20实验五 微程序控制单元实验 ...
- 20145308刘昊阳 《Java程序设计》实验五报告
20145308刘昊阳 <Java程序设计>实验五 Java网络编程及安全 实验报告 实验名称 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: ...
- 数据结构实验五 查找算法的实现
广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼416B) 2019年6月11日 学院 计算机科学与教育软件学院 年级.专业.班 姓名 学号 实验课程名称 数据结构实验 成绩 实 ...
- 数据结构 实验五 停车场管理
实验五 停车场管理 1.实验目的: (1)掌握栈的使用方法. (2)掌握队列的使用方法. 2.实验环境与设备: 已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机. 3.实 ...
最新文章
- 神策 2021 数据驱动大会丨北京主会场首日直播,拼团早鸟票特惠来袭
- 【数据竞赛】数据竞赛中最贵的四个特征
- 【Python基础】不服不行,Python 操作 JSON 的门道也这么多~
- linux软件安装非系统盘,linux操作系统可不可以像安装windows软件一样在windows系统下的硬盘上安装...
- python数独游戏源代码100行_python实现自动解数独小程序
- 今天的你将感谢_今天感谢开发人员:这是
- 业务请求量膨胀的扩容技术实践
- Dilated Convolution(空洞卷积、膨胀卷积)详解
- Blender快捷键、技巧和软件配置
- 国企计算机岗位职称申请,在国企工作如何评定职称
- 关于蚂蚁的纯知识解读:杠杆、资本充足率、ABS
- vb/vb.net开发技巧荟萃(七)
- 新增收货地址管理 html,关于“收货地址”的二三事
- 如果iis的配置文件 applicationHost.config坏掉了, 会在 C:\inetpub\history\ 中存储历史备份。复制过去还原就可以了-摘自网络...
- Python绘制节点是饼状图的社交网络图(Plot network with pie chart)
- Android在线购物商城 app端+后台
- 4、51单片机——LCD1602 驱动(郭天祥)
- 解析:未来物联网发展的十大趋势
- office2016实用论文排版技巧
- Centos7分部骤编译单文件执行程序
热门文章
- 服务器硬件 做raid操作 ubuntu linux做raid
- linux命令ps -aux|grep xxx详解
- 你说话的方式,决定了你的命运!
- 苹果怎么删除通讯录联系人_苹果手机通讯录怎么恢复?这才是正确的打开方式!...
- lnmp编译安装mysql_LNMP编译安装教程
- double operator[](int i)_请谨慎使用float和double
- 修改鼠标手形 闪烁 在填写文字内容后也一直在闪烁
- 图像锐化拉普拉斯算子matlab,Matlab图像锐化-Sobel,Laplacian算子 实验教程
- su封面插件_儿豁嘛,这就是SU空间布线葵花宝典
- python开发精典课程_Andrew Ng经典机器学习课程的Python实现(第1部分)