如何設計一個簡單的聊天APP
1. 服務端設計思路 服務端主要實現(xiàn)以下功能: 處理客戶端登錄請求 處理客戶端設置請求(更改密碼、設置昵稱、設置留言等) 處理客戶端發(fā)送信息請求(文字、圖片、表情等) 處
1. 服務端設計思路
服務端主要實現(xiàn)以下功能:
- 處理客戶端登錄請求
- 處理客戶端設置請求(更改密碼、設置昵稱、設置留言等)
- 處理客戶端發(fā)送信息請求(文字、圖片、表情等)
- 處理客戶端發(fā)送文件請求(包括發(fā)送離線文件請求)
- 處理客戶端聊天記錄下載請求
- 處理客戶端查詢用戶列表、添加好友等請求
上述功能圍繞著網(wǎng)絡通信和數(shù)據(jù)庫維護展開。任務處理邏輯如下:
- 使用Windows完成端口線程池技術實現(xiàn)網(wǎng)絡通信,可以使用現(xiàn)有的網(wǎng)絡庫。當新的請求報文到達時,實例化對應的任務類,并投遞到一個任務隊列中。
- 任務隊列使用信號量內核對象來維護,當有新的任務時,從線程池中激活一個線程去執(zhí)行該任務。
具體業(yè)務邏輯細節(jié)如下:
- 當客戶端接入但超過n分鐘未登錄時,服務端會主動斷開該客戶端的連接,以節(jié)約資源。
- 客戶端登錄時,在數(shù)據(jù)庫中記錄該用戶的IP地址和端口號,并標記為已登錄狀態(tài)。已登錄的客戶端不允許重復登錄。當客戶端注銷、主動掛斷或被動掛斷等事件發(fā)生時,清除該用戶的登錄狀態(tài)。
- 客戶端發(fā)送消息傳送請求時,服務端先判斷目標用戶是否在線。如果在線,直接將消息轉發(fā)到目標用戶所在的客戶端IP/端口;否則,將消息存入數(shù)據(jù)庫,在目標用戶登錄時進行推送。
- 客戶端發(fā)送文件請求時,如果雙方均在線,則服務器協(xié)調雙方客戶端進行直連。如果直連成功,發(fā)送方直接向接收方發(fā)送文件,服務端不介入數(shù)據(jù)轉發(fā)。如果直連不成功或接收方不在線,服務器要求客戶端先發(fā)送文件驗證信息,以查詢將要發(fā)送的目標文件。如果服務端已經(jīng)存在相同的文件(文件名、大小和MD5校驗相同),則通知客戶端無需上傳,并在數(shù)據(jù)庫中對已存在的文件引用計數(shù)加1。如果服務端不存在該文件,則通知客戶端發(fā)送文件并進行接收。
- 當服務端收到客戶端下載聊天記錄請求時,從數(shù)據(jù)庫中查詢該用戶的聊天記錄,并分頁傳送給客戶端。
2. 客戶端設計思路
任何報文請求都遵循以下步驟:
- 發(fā)送請求報文
- 等待服務端處理結果
- 對結果進行處理