Java實現仿QQ聊天工具的項目總結

在寫這篇文章之前,首先要感謝我的隊友的辛勤付出,沒有他們的付出與配合,這個項目是不能順利完成的。

資源文件:工程文件可運行JAR包

第一點

經驗:項目開始之前應該先向老師或者學長先詢問經驗、或者到網上查找經驗,看看如何開發效率高;一個好的開發工具可以大大提升開發效率

但是我們的做法是:因爲我們沒有這一塊知識,所以想在網上找一份代碼來參考一下,但是效果不佳,因爲根本不懂這一塊的內容,所以看不太懂。於是我們小組第一次開會的時候兩個小時除了分工:四個人做四個界面,就只裝了一個數據庫;

那麼我們就需要先找一本好一點的教材入門,我們到圖書館裏面尋找這一類的書,但是沒有什麼收穫,後來我們組的S拿出了一份電子版的書供我們參考,但是其實教材的用處不大,我根據這本教材還有一些參考代碼寫了初始界面,花了我三天左右的時間!(11.18-11.20)然後於11.21,又是我們的隊友S,告知了有Window Builder可以像Qt一樣可視化開發,因爲原來的代碼不能移植,於是我就花了一下午的時間重新使用WB設計了一遍,一下午VS三天(這就是效率的差別,浪費了我許多時間,而且收穫不大)
第一部分的細節見 這篇博客

寫主界面時遇到的主要問題及解決

  1. 插入圖片大小不能自適應swing組件
    解決: 到網上找了在組件中重寫圖片的算法,新建了common類,將算法封裝起來(靜態函數)
  2. 沒有現成的組件直接實現好友框;
    解決:因爲窗口體可以分成一個個的小窗個(Panel),於是使用Panel作爲容器,按照qq的好友框的樣式做了我們的項目的好友框
  3. 在點擊"我的好友“標籤時怎麼顯示所有好友
    解決:因爲窗格是可以顯示和隱藏的、且能重新設置位置,於是在點擊我的好友時,重排好友窗格,並設置爲顯示,再次點擊時,設置爲隱藏並重拍
    通過這個過程我也熟悉了圖形界面的設計過程

第二點

經驗:在項目開始之前應該先將設計文檔寫好,包括命名標準,規範;如何實現不同類之間的傳參,不同界面傳參時要留出什麼接口;先確定實現的功能,然後根據功能去設計類的成員變量,需要什麼函數(先寫出函數名,參數,函數的實現留到具體做的時候),類在設計的時候將功能註釋在開頭; 還有如何將類打包(結構要規範,查找時有效);對於重要的地方要有註釋。

這一點我在寫代碼的時候就深有體會,雖然我大體上分了幾個包:小組件、窗口體、常用函數,但是對於主界面沒有將其分爲三個窗格,用三個類實現。而是直接用WB寫成一個類,所以這一塊的參數就直接在initializa函數裏面定義了,而不是定義爲類的成員,傳參時就一直修改,將函數內的變量修改爲類的成員,改得有點亂了。同樣的窗口之間的傳參也是後來通過修改構造函數來傳參。雖然能實現功能,但是整體的架構就亂了。體會到了代碼結構的重要性

實現主界面功能遇到的主要問題及解決

  1. 如查找並添加好友
    解決:分爲個2步驟
    1)數據庫中查詢是否有此用戶的存在:隊友S將其Java對數據庫的常用操作封裝成了一個類,我對其中函數的進行了參數的修改,使其能夠被我調用,獲取用戶的信息。這樣我能夠在查找窗口查找時判斷用戶是否存在。
    2)確認添加好友後如何更新好友列表:因爲主界面無法監聽查找窗口的事件,於是我在查找窗口中添加了一個boolean類型的成員sign,作爲是否要添加新好友的標誌,和添加好友的QQ號,並且將查找窗口變爲主界面的一個成員,在點擊好友列表的時候添加新的好友,缺點就是需要點擊好友標籤時才能更新,本來是想主界面的窗格監聽鼠標的移動來更新的,但是沒有效果。
  2. 如何移動好友和實現刪除操作
    解決:對好友窗格設置兩個屬性:isMember是否是列表成員,isFriend是否是好友,在更新好友欄的函數中先進行判斷操作,決定是否刪除和移動,再重置好友的窗格

通過這個給過程我也熟悉了數據庫的操作

第三點

經驗:在項目開始的時候就應該確定好小組中不同部分要怎麼連接,要留出什麼接口,如何傳參,我們這個項目最重要的參數就是QQ號,要通過它查找數據庫中的內容,所以這個參數如何傳遞在一開始就要確定好,還有既然是通信工具,就需要有端口,端口這一參數的傳遞也很重要,並且,一開始就要確定好端口如何分配

在連接整個項目時遇到的問題及解決

  1. 數據庫的代碼修改,使其能夠適應我的主界面的調用
    解決:通過詢問隊友S,和網上查找資料,對數據庫類的函數進行了修改,同時修改了我主界面中的更新資料的函數,隊友S後來發現了可能有sql注入的風險,寫了一個判斷的函數,將其加入了數據庫類中,點贊
  2. 如何將主界面和對話窗口合併
    解決:
    1)在和隊友L的討論中,添加了端口這一參數,並且修改了構造函數來傳遞端口參數,因爲隊友L原來的代碼中端口是固定的,於是修改了端口的參數,但是發現不行,debug過程中發現雙擊好友窗格,彈出的客戶端"對話窗口"時,傳給對話窗口的參數應該是自己的端口。
    2)但是用戶仍然無法對話,後來靠譜的隊友L發現start函數沒有運行的問題,於是可以運行了。客戶端的問題解決了,然後我寫了主函數,判斷服務器什麼時候應該啓動。
  3. 將登錄界面和主界面合併,還有將資料界面和主界面合併
    解決:
    1)登錄界面的合併,因爲這一部分只需要傳遞QQnum這一參數,所以比較容易。我和隊友W一起進行了登錄界面代碼邏輯的完善
    2)資料界面的和主界面的合併,我和隊友W又一起完成了資料界面的代碼邏輯,然後就是修改資料需要在主界面更新,這個和好友列表的更新類似,有一個缺點就是需要雙擊簽名欄才能更新主界面的資料

第四點

經驗

  1. 每做一次修改優化,不止要導出Jar包(可運行,或不可運行),還需要留下代碼,方便以後出了bug可以有前一個版本可以參考和使用。
    在這裏插入圖片描述
    只導了jar包,沒導代碼的我~ _ ~
  2. 若新的代碼需要對數據庫進行修改,那麼最好新建一個數據庫(防止已有的數據出錯)
  3. 對於每一個版本都要做一次完全的測試(測試工作很重要!!!),都通過了才進行下一個版本的演化

本着將項目做到完美的想法,我開始了我對工程的修改,於是…

  1. 添加了右下角任務欄的小圖標,這個改得還行
  2. 因爲我希望我們的工程能有較好的移植性:
    1)於是我先導出了Jar包使使運行起來如何,但是運行時沒有圖片,我上網查找了發現是圖片路徑的問題,因爲我的圖片都是使用common類中的函數來生成image對象的(沒想到這個做法挺有用),於是將所有圖片放在和common同一個包,然後使用URL類的對象獲取common.class.getResource(pictureName),再通過Ecilpse的search工具修改一下我原來所有圖片的路徑從src/data/name.jpg變爲了name。然後導出包,運行,成功!
    2) 然後就是悲慘的故事了,我希望能夠我們的項目能夠移植到有mysql數據庫的新環境,於是我就在調用數據庫的類中添加了一個新建新的數據庫和新的表的函數,通過網上查找資料,修改了一下函數,調試後,運行起來是能夠建立新的數據庫和表的,但是我沒有測試是否能夠註冊和登錄,能夠打開登錄界面就覺得萬事大吉了,而且沒有保存前一個版本能運行的代碼。然後答辯時就只能拿初始版本答辯,都是淚啊!!!

隊友L的經驗
關於“基於JAVA圖形化編程進行socket通信”總結:

一. 界面圖形化部分:

  1. Builder裏面會把所有的按鍵寫到構造函數裏面,接收消息會出現問題,所以,至少“發送”按鈕及其監聽要自己手敲代碼,寫在構造函數之外。

  2. 把文本框的可寫功能關閉之後,並不能阻止客戶端通過函數向其內部寫入內容,不需要“開啓,寫入,再關閉”。

  3. JAVA的FlowLayout流式佈局類,有時候寫好後的界面會以一種奇怪的方法排列,直接用Builder會方便很多。

  4. JAVA設計出的圖形化界面,如果不設置“窗口大小鎖定”,隨意改變窗口大小,其上的組件也會變得“隨意改變”。

二. socket通信部分:

  1. 服務器用完要關閉,否則再次打開客戶端可能會出現“點擊發送而沒有反應”的現象,即服務器的關閉,應在主函數結束之前完成。

  2. 儘量不要進行利用時間的監聽,延遲很大。

  3. 單獨服務器,A發給服務器要一個端口,服務器發給B要一個端口,B發給服務器要一個端口,服務器發給A要一個端口,四個端口各不相同。

  4. 如果不建服務器,單獨互爲服務器和客戶端,則只需要兩個端口。

  5. 單獨建服務器,只要有足夠的客戶端,就能輕易地實現羣聊功能,而若是互爲服務器和客戶端,轉變爲羣聊功能則會很複雜。

  6. 127.0.0.1,本機保留IP地址。

  7. 服務器要用公網IP,客戶端則不一定需要(服務器如果用局域網IP,則與不同主機的客戶端無法接通)。

然後項目截圖
1.登錄界面(隊友W完成)
在這裏插入圖片描述

2.註冊界面(隊友W完成,進行了業務邏輯判斷)
在這裏插入圖片描述
3.主界面(我完成)
界面詳細見:這篇博客
演示好友列表的功能
(1)移動
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

5.遊戲(隊友S完成)
在這裏插入圖片描述
小圖標:
在這裏插入圖片描述

6 .聊天界面(隊友L完成)
在這裏插入圖片描述
至此,完成。


1.9
我來更新啦
本次提升了軟件的可移植性,只要你的電腦裝了MySQL數據庫,並且輸入正確的賬號密碼,那麼就可以在你的電腦上使用了。
思路是:先獲取你本地數據庫的賬號密碼,然後將其存在一個文件database中。在第一次運行時會先連接到你本地的數據庫,然後創建一個新的數據庫和表格。之後每次運行時讀取文件database中的賬號密碼然後連接本地數據庫,進行數據庫操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章