項目:微聊

目錄

1 項目簡介

2 項目功能

2 相關技術

3 實現思路

4 使用教程

5 項目測試報告

5.1 測試用例

5.2 測試環境

5.3 測試結論

5.3.1 功能測試

5.3.2 性能測試

5.3.3 安全性

5.3.4 可靠性

5.3.5 易用性

5.3.6 兼容性


1 項目簡介

一款支持註冊、私聊、羣聊、退出功能的網絡聊天室

2 項目功能

項目主要包含以下主要功能點:

  1. 註冊:用戶啓動程序,通過填寫用戶名、密碼註冊賬號。註冊成功,提示“註冊成功”;註冊失敗,返回錯誤信息。
  2. 私聊:註冊成功的用戶,可以私聊其他在線用戶。
  3. 羣聊:在線用戶可以進行羣聊,所有在線用戶都能收到羣聊消息。
  4. 退出:用戶下線,服務端提示該用戶下線。

2 相關技術

  • Java基礎
  • Socket編程
  • 多線程

3 實現思路

我們每天都接觸大量的聊天軟件(QQ、微信等),那麼在使用之後,我們自己也可以DIY一個簡便的聊天工具。於是就有了“微聊”。下面我將談談具體思路。

當我們(客戶端)在使用聊天軟件通信時,並不是直接發送消息給對方(或直接接收對方發來的消息)而是通過服務器進行交互的。服務器負責處理通信雙方的具體業務。那麼如何實現客戶端與服務端的通信呢?這時候就想到了依靠套接字編程來實現。

服務端建立ServerSocket類的一個實例,客戶端建立一個Socket類的實例。雙方進行通信。。。

在一系列創建套接字、等待連接等操作後,服務端與客戶端就可以開始通信。它們之間可以互相接收和發送數據。但,我們現在還只是完成了一部分。要想實現一個網絡聊天室,我們必須實現讓客戶端和客戶端之間能互相通信。這就意味着我們的服務器端現在必須實現下面兩點:

  1. 同一時間可能要處理多個客戶端的業務。
  2. 服務端要能讓多個客戶端之間相互通信(即服務端要讓客戶端之間能相互發送和接收數據),這樣就能實現我們的私聊和羣聊功能啦!

那麼具體如何實現呢?

我們可以在服務端抽象出一個類(業務類),專門處理客戶端的業務。因爲同一時間可能會有多個客戶端在跟服務端請求業務,這時就想到了多線程。我們可以構造多個線程來處理業務,當客戶端請求業務的時候,專門有線程處理該客戶端的業務,不影響其他客戶端。我們都知道創建多線程有三種方式,但這裏我並沒有手動創建多個線程,而是採用的是線程池,主要原因是:

  1. 提高線程的可管理性:使用線程池可以統一進行線程分配、調度與監控;
  2. 提高響應速度:當新任務到達時,任務不需要等待線程創建就可以立即執行;
  3. 降低資源消耗:通過重複利用已經創建好的線程降低線程創建與銷燬帶來的損耗。

在線程池創建好後,就要想到要將每個客戶端對應的Socket存放到哪裏呢?首先想到的是HashMap,因爲客戶端註冊的時候是要輸入用戶名的,所以讓客戶端名爲Key,該 客戶端對應的Socket爲Value。在敲完代碼之後,運行程序發現程序出現了死循環((⊙o⊙)…what?),查資料,查資料,哦!想起來了,HashMap在多線程環境下進行put操作會引起死循環,所以線程不安全,怪不得呢,那就用HashTable吧,線程安全。趕緊改代碼,...改完了,走起!程序運行起來效率好低啊,怎麼肥四?嗯,看代碼發現,HashTable爲了保證線程安全,內部使用synchronized同步方法,這樣做相當於把整個哈希表上鎖,鎖粒度太粗,性能很低。怎麼辦?還好,ConcurrentHashMap出場了,ConcurrentHashMap內部採用鎖分段技術保證線程安全,提高效率。完美!

到這裏服務端就能同時處理多個客戶端的業務了。那麼下一步如何讓客戶端與客戶端之間通信呢?假設A客戶端想給B客戶端發送消息,我們可以先讓服務端接收A客戶端的發來的消息,服務端再將消息轉發給B客戶端。因爲A和B是不能直接通信的,這樣就讓他倆能通信了,相當於服務端提供一個轉發數據的能力。而服務端處理數據的功能就可以交由它抽象出來的業務類實現了,再次就不一一贅述了。

整理好這些思路後,下面就是實現具體的細節上的東西了(敲代碼ing...)

最後項目的整個編碼工作就做完了。下面對項目進行測試。

4 使用教程

1. 下載程序發佈的jar包,分別是

myChatRoom-server-1.0.0.jar

myChatRoom-client-1.0.0.jar

2. 在Windows命令行運行jar包(這裏要注意:要先啓動服務端)

java -jar myChatRoom-server-1.0.0.jar

java -jar myChatRoom-client-1.0.0.jar

出現以下提示:

 

3.下一步,客戶端就可以根據提示信息註冊了

客戶端Jack註冊:

 

服務端顯示連接上的客戶端的IP以及端口號信息:

4.客戶端可以互相通信了

Rose給Jack發消息:

Jack接收到Rose發來的消息:

5.除此之外,客戶端也可以按照幫助文檔進行羣聊,這裏就省略了。

5 項目測試報告

5.1 測試用例

 

5.2 測試環境

軟件環境 操作系統:Windows10、Linux(Centos7)
硬件環境 PC機1臺,處理器:Intel(R) Core(TM) i5-7200U CPU @2.50GHz  2.71GHz;內存4.0GB

5.3 測試結論

5.3.1 功能測試

測試目標:確保系統的功能正常,其中包括註冊、私聊、羣聊等功能。

測試方法:手工黑盒測試

測試過程依照測試用例,在這裏只簡單描述。

註冊:用戶名和密碼格式正確,註冊成功;用戶名和密碼格式不正確,提示錯誤信息(該功能正常)

私聊:私聊對象格式正確,發送的消息長度在允許範圍內,私聊成功;否則,提示錯誤信息(該功能正常)

羣聊:羣聊消息長度在允許範圍內,羣聊成功;否則,提示錯誤信息(該功能正常)

退出:客戶端關閉,程序正常退出(該功能正常)

5.3.2 性能測試

線程池大小默認爲10(該值可在程序內自行設置),即支持客戶端最大併發數爲10個。

1.響應時間:不超過0.4s;

2.支持最大在線用戶數:線程池大小爲最大在線用戶數

3.壓力測試:

  當在線用戶數達到最大時,繼續註冊新用戶。程序輸出異常

  bug修復:當在線用戶數達到最大時,停止註冊新用戶,直到有其他用戶下線。

5.3.3 安全性

  1. 所有的密碼不明碼顯示、存儲與傳輸;
  2. 有密碼設置策略,包括最小長度、非空設置、大小寫敏感;
  3. 預防SQL注入;

5.3.4 可靠性

成熟性 隨機選擇輸入,能夠處理系統失效的數據
容錯性
1.能屏蔽用戶的誤操作
2.對錯誤有正確提示
3.輸入錯誤數據時,系統不崩潰、不異常退出也不丟失數據

 

5.3.5 易用性

  1. 提示信息直觀、友好;
  2. 系統易操作;

5.3.6 兼容性

系統兼容 Windows10、Linux(Centos7)

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