目錄
1 項目簡介
一款支持註冊、私聊、羣聊、退出功能的網絡聊天室
2 項目功能
項目主要包含以下主要功能點:
- 註冊:用戶啓動程序,通過填寫用戶名、密碼註冊賬號。註冊成功,提示“註冊成功”;註冊失敗,返回錯誤信息。
- 私聊:註冊成功的用戶,可以私聊其他在線用戶。
- 羣聊:在線用戶可以進行羣聊,所有在線用戶都能收到羣聊消息。
- 退出:用戶下線,服務端提示該用戶下線。
2 相關技術
- Java基礎
- Socket編程
- 多線程
3 實現思路
我們每天都接觸大量的聊天軟件(QQ、微信等),那麼在使用之後,我們自己也可以DIY一個簡便的聊天工具。於是就有了“微聊”。下面我將談談具體思路。
當我們(客戶端)在使用聊天軟件通信時,並不是直接發送消息給對方(或直接接收對方發來的消息)而是通過服務器進行交互的。服務器負責處理通信雙方的具體業務。那麼如何實現客戶端與服務端的通信呢?這時候就想到了依靠套接字編程來實現。
服務端建立ServerSocket類的一個實例,客戶端建立一個Socket類的實例。雙方進行通信。。。
在一系列創建套接字、等待連接等操作後,服務端與客戶端就可以開始通信。它們之間可以互相接收和發送數據。但,我們現在還只是完成了一部分。要想實現一個網絡聊天室,我們必須實現讓客戶端和客戶端之間能互相通信。這就意味着我們的服務器端現在必須實現下面兩點:
- 同一時間可能要處理多個客戶端的業務。
- 服務端要能讓多個客戶端之間相互通信(即服務端要讓客戶端之間能相互發送和接收數據),這樣就能實現我們的私聊和羣聊功能啦!
那麼具體如何實現呢?
我們可以在服務端抽象出一個類(業務類),專門處理客戶端的業務。因爲同一時間可能會有多個客戶端在跟服務端請求業務,這時就想到了多線程。我們可以構造多個線程來處理業務,當客戶端請求業務的時候,專門有線程處理該客戶端的業務,不影響其他客戶端。我們都知道創建多線程有三種方式,但這裏我並沒有手動創建多個線程,而是採用的是線程池,主要原因是:
- 提高線程的可管理性:使用線程池可以統一進行線程分配、調度與監控;
- 提高響應速度:當新任務到達時,任務不需要等待線程創建就可以立即執行;
- 降低資源消耗:通過重複利用已經創建好的線程降低線程創建與銷燬帶來的損耗。
在線程池創建好後,就要想到要將每個客戶端對應的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 安全性
- 所有的密碼不明碼顯示、存儲與傳輸;
- 有密碼設置策略,包括最小長度、非空設置、大小寫敏感;
- 預防SQL注入;
5.3.4 可靠性
成熟性 | 隨機選擇輸入,能夠處理系統失效的數據 | |||
容錯性 |
|
5.3.5 易用性
- 提示信息直觀、友好;
- 系統易操作;
5.3.6 兼容性
系統兼容 Windows10、Linux(Centos7)