1. 程式人生 > >(QT) C++ 版本IM通訊軟體(客戶端+伺服器文字聊天、檔案斷點續傳、線上使用者搜尋)

(QT) C++ 版本IM通訊軟體(客戶端+伺服器文字聊天、檔案斷點續傳、線上使用者搜尋)

緊接著上一節課程,這次的作業是要求實現一個簡易版的“QQ”,可支援“軟體需求”所列出的功能。當時由於圖方便便選擇了QTCPSocket進行整個過程的通訊(事後才知道有多坑)。服務端介面比較簡單,就幾個按鈕一個進度條,主要在客戶端實現了基本的功能和介面。整個學習和開發階段持續了將近3個禮拜,可謂是歷史悠久。總的來說功能都實現了,但是存在一定的bug,估計以後也沒時間去搞了,留在這兒當做一個自我的學習記錄和新手的學習借鑑Demo。

執行要求

  • 同一區域網,預設埠:1234和4321,分別是聊天服務和檔案服務。
  • 服務端程式碼為:SocketServer.rar
  • 客戶端程式碼為:SocketClient.rar

軟體需求

  1. 支援文字訊息的傳輸;
  2. 支援區域網內線上使用者搜尋的功能;
  3. 可以採用c/s或者b/s結構,也可以混合結構;
  4. 支援檔案傳輸功能;
  5. 支援1GB大小的資料檔案正確傳輸;
  6. 支援斷點續傳的功能。

主要特點為

  1. 利用QTCPSocket完成通訊,包括聊天和檔案上傳。
  2. 仿QQ雙擊條目開啟視窗聊天,收到訊息自動彈窗。
  3. 支援拉取歷史聊天記錄,從服務獲取,預設全時間段。
  4. 利用QLineEdit組合QPushButton實現線上使用者搜尋,並高亮顯示。
  5. 可支援跨機器的登入與註冊。
  6. 服務端推送的線上使用者列表,客戶端實時更新。
  7. 輕量級的sqlite資料庫,無需配置額外環境。
  8. 使用者下線的監聽,包括正常下線和異常下線,都可捕獲。
  9. 支援離線檔案傳輸,A客戶端先發送到服務端,服務端儲存一份,再發送到B客戶端。
  10. 支援GB級大檔案的快速傳輸。
  11. 支援斷點續傳,客戶端點選暫停模擬斷開連結或者客戶端關閉視窗或者客戶端下線,點選重新發送重連服務端進行續傳即可。

由於每次的C-S互動過程都涉及到資料傳輸格式,因此需要制定一個簡單易理解的資料交換格式,如下:

資料交換格式

描述 客戶端請求 服務端返回
登入 login # username # password login # login success # true(false)
註冊 register # username # password register # username # register success # true(false)
聊天 chat # 傳送者 # 接受者 # message chat # 傳送者 # message
線上使用者列表 getUserList getUserList # username1 # username2……
新連線(更換登入socket) newconnect # username 無返回
斷點續傳 continue # 傳送者 # 接受者 # 檔案總長度 # 剩餘資料長度 # 檔名 無返回
歷史聊天記錄 record # 傳送者 # 接受者 record ## 傳送者 ## 接受者 ## 文字內容 ## 傳送時間 ##(精確到毫秒)**

上表中,record ##用來標識每條聊天記錄的切分點,因為涉及到N多條聊天記錄。
末尾的**用來標識聊天記錄結束,是結束符,由於聊天記錄也許會很大,因此需要用來判斷是否需要分包接收服務返回記錄。

服務端介紹

  • 登入與註冊

登入與註冊

服務端使用sqlite資料庫儲存使用者註冊的賬號和密碼,在同一區域網內支援不同機器的登入。每次客戶端傳送請求服務端會給予一定的返回,然後客戶端再根據這個返回值執行邏輯。

登入與註冊

上圖是登入表,四個欄位,使用isLogin區分是否登入,socketID儲存客戶端控制代碼,註冊的話插入就行。

  • 聊天

這裡寫圖片描述

客戶端A要傳送訊息給客戶端B的時候,先發送訊息到服務端,服務端拿到傳送者和接受者名字後,尋找到接收者相應的socket,然後再進行轉發,然後傳送成功後會有返回值給傳送者A,傳送者A拿到返回值後確認傳送成功。然後聊天的所有訊息記錄可以儲存到資料庫中,以便客戶端隨時遠端同步訊息記錄。服務端此處的邏輯是:客戶端發訊息到主介面(線上使用者列表介面),然後主介面將收到的訊息根據傳送者進行分發,開啟不同的聊天視窗,而不是在聊天視窗接受訊息,分發方式使的客戶端的管理更加清晰。

這裡寫圖片描述

  • 檔案上傳

檔案上傳

可以看到服務端會受到來自於客戶端1的檔案,首先儲存到伺服器,然後會將該檔案轉發到接收端dl,在途中會觸發兩次進度條讀條,同時服務端會列印整個傳輸過程。

這裡寫圖片描述
這裡寫圖片描述

上圖是斷點續傳的服務端觸發過程以及斷點續傳記錄儲存表,若發生斷點,則儲存已傳送資料長度為斷點位置,下次續傳時從記錄位置開始上傳。當有來自於A的同名檔案到達時,先查詢資料庫已傳送資料長度是否等於總長度,若相等則為新檔案,若不相等則為續傳檔案。

客戶端介紹

  • 客戶端類圖

客戶端類圖

  • 客戶端主要工程結構

    1. Mysql類和SocketUtil類為公共類,Mysql儲存一些必要資料,SocketUtil主要實現一些封裝的公共函式,如connect函式;
    2. 主要實現類為Login(登入功能)、Register(註冊功能)、Chat(聊天功能)、OnlineUserlist(線上使用者列表和搜尋功能)。這幾個基礎類分別繼承於ISOCKETSink類,此類用作Socket操作結果的回撥,其中Success和Fail方法為虛擬函式,基類呼叫實現各自的具體返回結果顯示。
  • 客戶端登入註冊介面

登入註冊這裡寫圖片描述

  • 客戶端線上使用者列表和搜尋介面

客戶端線上使用者列表和搜尋介面這裡寫圖片描述

  • 客戶端聊天介面

客戶端聊天介面客戶端聊天介面

  • 客戶端傳送檔案介面

客戶端傳送檔案介面客戶端傳送檔案介面

傳送檔案本專案為離線檔案傳送,檔案傳送流程為客戶端->服務端->轉發給客戶端。當實現斷點續傳時,點選暫停,斷開當前連線,關閉當前檔案,停止傳送,點選重新開始時,檔案從上次斷開的位置繼續傳送,直至檔案接收完成。

  • 客戶端斷點續傳和接收檔案介面

客戶端斷點續傳和接收檔案介面客戶端斷點續傳和接收檔案介面客戶端斷點續傳和接收檔案介面

操作流程

  1. 首先開啟 Tserver.exe,點選“開啟聊天服務”和“開啟檔案服務”,剩下的服務端就不用動了,處於開啟狀態,繼續客戶端操作。
  2. 客戶端開啟exe,進入登入介面。點選註冊,註冊完成後返回登入介面進行登入。
  3. 登入成功後可以看到線上使用者列表(服務端推送實時重新整理),“線上使用者列表”介面,搜尋框輸入要搜尋的使用者,即可高亮顯示被搜尋使用者名稱。
  4. 雙擊使用者名稱進行聊天,支援自己給自己傳送訊息,輸入文字訊息,點選“傳送訊息”,即可傳送文字。
  5. 支援聊天記錄檢視,默認同步的是從服務獲得的所有時間段的聊天記錄。
  6. 點選選擇檔案按鈕,即可選擇任意型別檔案,點擊發送,即可線上傳送檔案。
  7. 點選暫停模擬斷點,此時已經斷開客戶端socket連線。再次點選繼續,從斷點位置開始上傳。或者斷開客戶端,下線或者關閉視窗,重新開啟後選擇同名檔案即可繼續完成檔案續傳操作。
  8. 上傳完成後介面顯示已傳送檔名和傳送成功標誌。
  9. 服務端同步顯示傳送進度和傳送成功狀態。
  10. 此檔案傳送為離線檔案傳送,即客戶端先發送檔案到服務端,服務端非同時轉發,而是接受檔案完成後再將此檔案傳送到接收端。