Netty實戰 IM即時通訊系統(一)IM系統簡介
阿新 • • 發佈:2018-12-27
##
零、 目錄
- IM系統簡介
- Netty 簡介
- Netty 環境配置
- 服務端啟動流程
- 實戰: 客戶端和服務端雙向通訊
- 資料傳輸載體ByteBuf介紹
- 客戶端與服務端通訊協議編解碼
- 實現客戶端登入
- 實現客戶端與服務端收發訊息
- pipeline與channelHandler
- 構建客戶端與服務端pipeline
- 拆包粘包理論與解決方案
- channelHandler的生命週期
- 使用channelHandler的熱插拔實現客戶端身份校驗
- 客戶端互聊原理與實現
- 群聊的發起與通知
- 群聊的成員管理(加入與退出,獲取成員列表)
- 群聊訊息的收發及Netty效能優化
- 心跳與空閒檢測
- 總結
- 擴充套件
一、 IM系統簡介
- 單聊流程
- 單聊指的是兩個使用者之間相互聊天。 使用者單聊的基本流程
- 如上圖,A 要和 B 聊天,首先 A 和 B 需要與伺服器建立連線,然後進行一次登入流程,服務端儲存使用者標識和 TCP 連線的對映關係
- A 發訊息給 B,首先需要將帶有 B 標識的訊息資料包傳送到伺服器,然後伺服器從訊息資料包中拿到 B 的標識,找到對應的 B 的連線,將訊息傳送給 B
- 任意一方發訊息給對方,如果對方不線上,需要將訊息快取,對方上線之後再發送
- 我們把客戶端與服務端之間相互通訊的資料包稱為指令資料包,指令資料包分為指令和資料,每一種指令對應客戶端或者服務端的一種操作,資料部分對應的是指令處理需要的資料。
- 單聊指的是兩個使用者之間相互聊天。 使用者單聊的基本流程
- 單聊的指令
-
指令圖示
-
指令列表
指令內容 | 客戶端 | 服務端
–|
登入請求 | 傳送 | 接收
登入響應 | 接收 | 傳送
客戶端訊息 | 傳送 | 接收
服務端訊息 | 接收 | 傳送
登出請求 | 傳送 | 接收
登出響應 | 接收 | 傳送
-
- 群聊流程
- 群聊指的是一個組內多個使用者之間的聊天,一個使用者發到群組的訊息會被組內任何一個成員接收,下面我們來看一下群聊的基本流程
- 如上圖所示 , 要實現群聊,其實和單聊類似
- A,B,C 依然會經歷登入流程,服務端儲存使用者標識對應的 TCP 連線
- A 發起群聊的時候,將 A,B,C 的標識傳送至服務端,服務端拿到之後建立一個群聊 ID,然後把這個 ID 與 A,B,C 的標識繫結
- 群聊裡面任意一方在群裡聊天的時候,將群聊 ID 傳送至服務端,服務端拿到群聊 ID 之後,取出對應的使用者標識,遍歷使用者標識對應的 TCP 連線,就可以將訊息傳送至每一個群聊成員
- 如上圖所示 , 要實現群聊,其實和單聊類似
- 群聊指的是一個組內多個使用者之間的聊天,一個使用者發到群組的訊息會被組內任何一個成員接收,下面我們來看一下群聊的基本流程
- 群聊指令集
-
指令圖示
-
指令列表
指令內容 | 客戶端 | 服務端 --| 建立群聊請求 | 傳送 | 接收 群聊建立成功通知 | 接收 | 傳送 加入群聊請求 | 傳送 | 接收 群聊加入通知 | 接收 | 傳送 傳送群聊訊息 | 傳送 | 接收 接收群聊訊息 | 接收 | 傳送 退出群聊請求 | 傳送 | 接收 退出群聊通知 | 接收 | 傳送
-
- Netty
- 我們使用Netty 統一的IO讀寫API以及強大的pipeline 來編寫業務處理邏輯 , 在後續的章節 , 我會通過IM這個例子 ,帶你瞭解Netty的一下核心知識點
- 服務端如何啟動
- 客戶端如何啟動
- 資料載體ByteBuf
- 長連自定義協議如何設計
- 粘包拆包原理及實踐
- 如何實現自定義編解碼
- pipeline 與 channelHandler
- 定時傳送心跳怎麼做
- 如何進行連線空閒檢測
- 客戶端使用Netty的程式邏輯結構
- 首先,客戶端會解析控制檯指令,比如傳送訊息或者建立群聊等指令
- 然後,客戶端會基於控制檯的輸入建立一個指令物件,使用者告訴服務端具體要幹什麼事情
- TCP 通訊需要的資料格式為二進位制,因此,接下來通過自定義二進位制協議將指令物件封裝成二進位制,這一步稱為協議的編碼
- 對於收到服務端的資料,首先需要截取出一段完整的二進位制資料包(拆包粘包相關的內容後續小節會講解)
- 將此二進位制資料包解析成指令物件,比如收到訊息
- 將指令物件宋丹對應的邏輯處理器來處理
- 客戶端使用Netty的程式邏輯結構
- 我們使用Netty 統一的IO讀寫API以及強大的pipeline 來編寫業務處理邏輯 , 在後續的章節 , 我會通過IM這個例子 ,帶你瞭解Netty的一下核心知識點