大體流程先記錄下,后面慢慢完善
登錄流程
- http 登錄 -> 返回 token,服務器時間 (并根據本地時間計算與服務器時間差量 D)
- 建立tcp長連接,發送握手包
- http 拉取好友id列表
- http 拉取群聊id列表
D = 服務器時間 - 本地時間
以上過程完成后,進入消息列表界面
拉取消息流程
- 獲取上次拉取消息的時間 T(本地時間+與服務器時間的差量),若沒有則默認為當前時間減去一天的時間
- http 攜帶 T 拉取離線消息,并將 T 更新為本次拉取消息的時間
- 根據返回結果的時間戳對消息列表進行倒排序(即將最新消息的item放到第一個)
進入好友列表界面
- 展開組,判斷此組內的好友最后拉取時間是否是在登錄時間之前
- http 若在此次登錄時間之前,則拉取當前組好友的頭像、簽名、昵稱、狀態等,并更新此次拉取時間;若在此次登錄之后,則不拉取
- 此后好友狀態變化可通過推送獲取
進入聊天界面
- http 用戶在此界面下拉,首先展示客戶端本地存儲的歷史消息,當本地歷史消息讀取完了,則從服務器拉取最長不超過一個月的消息記錄
- 若進入的聊天界面是群聊,則需要輪詢拉取此群聊界面的好友狀態,直至用戶關閉或者返回該聊天界面
發送聊天消息
- 用戶首先輸入消息,客戶端根據消息內容組成相應的包
- http 客戶端向服務端獲取一個消息id
- tcp 客戶端將新獲取到的消息id設置成該消息包的id,發送到服務端,并響應服務端的返回結果
- 消息包組裝分類
- 文本消息,直接組包發送
- 語言消息,需要先將語言文件上傳到oss,然后將oss返回的結果,組裝成消息包發送
- 圖片消息,與語音消息處理過程大體相同
- 視頻、短視頻消息,與語音消息不同的是,還需要上傳視頻的縮略圖,即上傳兩個資源
- 鏈接消息,目前直接當文本消息處理
發送消息撤銷指令
- 客戶端判斷該消息發送是否已超過2分鐘,若超過2分鐘,不允許撤回
消息指令響應
- 聊天響應消息指令,若返回失敗,客戶端需要表現出來
- 聊天消息推送指令,客戶需要將該消息展示到對應的聊天界面,并且做好本地存儲,同時還要回復服務器一條已收到消息的指令
- 撤銷消息指令,客戶端根據消息id,從聊天界面移除,并且展示撤銷痕跡,同時從本地數據庫中刪除該消息
- 加入群聊響應指令,將結果展示給用戶,并處理一些其它邏輯
- 加入群聊通知指令,在群聊界面展示
- 退出群聊響應指令,退出成功不做處理,退出失敗將原因展示給用戶
- 退出群聊通知指令,在群聊界面展示
- 其他更多指令開發中繼續擴展。。。