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、結課體會。本次實驗也讓我明白了,計算機專業是一個結合理論和實踐的學科,我們作爲軟件的開發者需要更多地從用戶的角度出發去開發軟件這樣才能夠滿足客戶的需求才能 夠寫出令人滿意的程序,才能夠開發出更好的項目。
發佈了11 篇原創文章 · 獲贊 9 · 訪問量 3315
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章