java《面向对象与多线程综合实验》报告

《面向对象与多线程综合实验》报告

1 实验目的
运用Java语言,以迭代方式逐步编程实现一个小型数据挖掘系统。由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本原理,理解和掌握继承与多态、异常处理、输入输出流、GUI设计、JDBC数据库操作、网络编程、多线程等技术;熟练掌握在Java语言环境下,上述技术的具体实现方法。
2 系统需求分析与设计
[请描述和介绍系统的需求分析和框架]
(1)系统介绍
基于客户端服务器端(Client-Server,C-S)模式,实现日志与物流数据信息的采集、匹配、保存、显示等功能,为数据分析挖掘提供基础支撑
(2)需求分析
程序流程图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)拓展和设计
① 文件追加方式优化
利用重写改变文件的追加方式
添 加 AppendObjectPutputStrea 类 , 继 承 ObjectOutputStrea 类,重写 writeStreamHeader() 方法,使数据可以以追加的方式存储进入文件。
在这里插入图片描述
(2)数据库的主键自增
1、利用Navicat Premium更改主键自增方式
在这里插入图片描述
在这里插入图片描述

2、在源代码中更改相关配置
在这里插入图片描述
在这里插入图片描述
添加executeSQLAndReturnPrimaryKey方法从数据库中获取增加主键的号码
从中获取的id后放入Object的对象中,再存入数据库中
在这里插入图片描述
重写的方法
在这里插入图片描述
3 系统功能实现
(1)程序实现记录
登录界面和注册界面展示
在这里插入图片描述
错误提示模版
在这里插入图片描述
成功提示模版
在这里插入图片描述
登录成功后显示操作界面,在操作界面上将老师愿给的保存日志和保存物流分开存放,更加便于用户操作,增加用户体验
在这里插入图片描述
在这里插入图片描述
线程自动刷新,主键自增展示
在这里插入图片描述

数据库中的数据展示
在这里插入图片描述

(2)程序逐代开发的过程
第一代:基于控制台的系统数据记录功能实现
在这里插入图片描述
在这里插入图片描述
第二代:基于控制台的系统数据记录功能实现

第一次写的文件保存是不可追加的方式进行
在这里插入图片描述
进行优化后的文件追加方式是可追加
在这里插入图片描述
第三代基于JDBC的控制台系统基本功能实现
实现数据库的基本操作
新建db数据库包,将数据库操作封装在DBUtil类中
1.加载数据库驱动
2.建立MySQL数据库连接
3.执行SQL语句来操作数据库(增删改查),得到执行结果
4.关闭数据库连接,释放资源

第四代基于SwingGUI的系统注册和登录界面设计实现
1.Windowbuilder插件实现用户注册、登录和主窗口界面开发及功能实现
2.界面开发中选取合适的布局、综合使用按钮、文本框、对话框等组件,实现良好的人机交互

设计成果展示
在这里插入图片描述
第五代基于SwingGUI的系统注册和登录界面设计实现及优化

GUI界面优化ID数据库自动获取(实现过程在拓展设计板块已详细说明)

第六代系统信息自动刷新功能实现
在这里插入图片描述
第七代系统客户端/服务器端数据发送(交互)功能实现
MainFrame:
利用 lambda 表达式的方式完成了发送按钮的监听功能。

创建 Socket 完成通信,客户端分别使用 6666 端口和 6668 端口发送保存的日志 信息和物流信息。创建序列化对象流,序列化对象输入流,用于传输。

配置文件中加入 ServerIP,则当 IP 地址发生变化时,不必修改源程序,只需 修改配置文件中的 IP 地址即可。

4 开发难点与体会
开发难点一:文件追加写入
难点介绍:
在每一次在用ObjectOutputStream以追加的方式往文件里面写入,在写入时打开一个流,用writeObject()写入对象后关闭流,然后又打开流,再追加写入对象。这样在用ObjectInputStream读取对象时,就会报异常java.io.StreamCorruptedException: invalid type code: AC,第一个对象是可以正常读出来,第二个对象就报异常了。
原因分析:
原因是在新建一个ObjectOutputStream对象时会首先在写入两个Short类型的数据,就是四个字节,在ObjectOutputStream的构造方法,里面调用了一个writeStreamHeader()方法,在这个方法中写入了两个Short类型的头部数据。
解决方案一:
在更改文件追加方式的时候一开始想要利用在用readObject()读对象的时候,先去掉4个字节的头部的方法实现文件可追加读出
byte[] buf =new byte[4];
fis.read(buf);
user=(User)ois.readObject(); //读取第二个对象
而在实际实现过程中却并不能实现,在我进行实现的过程中发现这种方法并不能实现,仍然会报错.同学们运用这种方法的也不能成功实现.因而我进行了第二种解决方法的实验.
解决方案二:
重写ObjectOutputStream 的 writeStreamHeader()方法。自定义追加写入对象的类
在这里插入图片描述
这种方法在实现的过程中比较顺利,因而没有什么困难.
开发难点二:数据库的创建
难点介绍:
因为系统的不同导致数据库的可视化程序与老师给定的不同,在运行自己下载的可视化程序时,很多步骤需要自己上网搜索

界面全英文,与老师讲解的完全不同

因系统不同mysql的配置也有所不同

开发难点三:数据库的主键自增
难点介绍:1、将数据保存进入数据库时,怎么保证数据中的 id自增;2、如 果用户输入两次的 id 一致并进行保存,数据库就会发生异常,怎么解决3、如果 存储进入数据库之后,id 主键自增了,获取该主键的值
原因分析:源代码中老师已经规定了需要自己输入id号,现在我们需要对其进行修改
解决方案:重写方法,定义自增
(详情见上面的拓展设计)

开发难点四:GUI的实现
难点介绍:GUI的设计是在c和c++中从未使用的,所以在实现的过程中我遇到了一些困难
1、 界面的设计
2、 组件的放置
3、 事件的响应
原因分析:
组件要先注册事件处理器,当读者单击组件、移动鼠标 或者敲击键盘都会产生事件(Event)。一旦有事件产生,应用程序做出对该事件 的响应,这些组件就是事件源(Event Source)。接受、解析和处理事件,实现 和读者交互的方法称之为事件处理器(Event Handler)。
解决方案:

  1. 新建一个组件(如 JButton)。
  2. 将该组件添加到相应的面板(如 JPanel)。
  3. 注册监听器以监听事件源产生的事件(如通过 ActionListener 来响应用户点击按钮)。
  4. 定义处理事件的方法(如在 ActionListener 中的 actionPerformed中定义相应方法)。
    5 实验总结
    1、知识的掌握。通过本次实验,我巩固了 Java 语言的基础知识,学会了 Java 输入 输出流,数据库操作,数据库语言,Java 常用系统类,泛型的使用,特别是 GUI 图形用户界面的开发,以及Java 核心中的多线程使用方法和使用步骤。了解了一些网络编程的相关知识,例如 URL,TCP 协议,UDP 协议,Socket 通信机制 和 Socket 网络编程。 通过这次实验也让我深刻 理解了 OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。OOP= 对象+类+继承+多态+消息,其中核心概念是类和对象。
    2、项目的优化和逐代开发,本次实验也是我第一次利用逐代开发的思路来进行完成一个比较大的项目而项目的优化就是针对实验过程中出现的一系列问题进行处理。
    例如文件追加过 程中,读取会抛出异常;数据库的主键自增问题,以及获取自增主键的方法等等 问题。
    3、结课体会。本次实验也让我明白了,计算机专业是一个结合理论和实践的学科,我们作为软件的开发者需要更多地从用户的角度出发去开发软件这样才能够满足客户的需求才能 够写出令人满意的程序,才能够开发出更好的项目。
发布了10 篇原创文章 · 获赞 9 · 访问量 254

猜你喜欢

转载自blog.csdn.net/qq_45621040/article/details/104113071