1. 程式人生 > >Netty實戰 IM即時通訊系統(一)IM系統簡介

Netty實戰 IM即時通訊系統(一)IM系統簡介

##

Netty實戰 IM即時通訊系統(一)IM系統簡介

零、 目錄

  1. IM系統簡介
  • Netty 簡介
  • Netty 環境配置
  • 服務端啟動流程
  • 實戰: 客戶端和服務端雙向通訊
  • 資料傳輸載體ByteBuf介紹
  • 客戶端與服務端通訊協議編解碼
  • 實現客戶端登入
  • 實現客戶端與服務端收發訊息
  • pipeline與channelHandler
  • 構建客戶端與服務端pipeline
  • 拆包粘包理論與解決方案
  • channelHandler的生命週期
  • 使用channelHandler的熱插拔實現客戶端身份校驗
  • 客戶端互聊原理與實現
  • 群聊的發起與通知
  • 群聊的成員管理(加入與退出,獲取成員列表)
  • 群聊訊息的收發及Netty效能優化
  • 心跳與空閒檢測
  • 總結
  • 擴充套件

一、 IM系統簡介

  1. 單聊流程
    1. 單聊指的是兩個使用者之間相互聊天。 使用者單聊的基本流程
      1. 如上圖,A 要和 B 聊天,首先 A 和 B 需要與伺服器建立連線,然後進行一次登入流程,服務端儲存使用者標識和 TCP 連線的對映關係
      2. A 發訊息給 B,首先需要將帶有 B 標識的訊息資料包傳送到伺服器,然後伺服器從訊息資料包中拿到 B 的標識,找到對應的 B 的連線,將訊息傳送給 B
      3. 任意一方發訊息給對方,如果對方不線上,需要將訊息快取,對方上線之後再發送
    2. 我們把客戶端與服務端之間相互通訊的資料包稱為指令資料包,指令資料包分為指令和資料,每一種指令對應客戶端或者服務端的一種操作,資料部分對應的是指令處理需要的資料。
  2. 單聊的指令
    1. 指令圖示

    2. 指令列表

      指令內容 | 客戶端 | 服務端
      –|
      登入請求 | 傳送 | 接收
      登入響應 | 接收 | 傳送
      客戶端訊息 | 傳送 | 接收
      服務端訊息 | 接收 | 傳送
      登出請求 | 傳送 | 接收
      登出響應 | 接收 | 傳送

  3. 群聊流程
    1. 群聊指的是一個組內多個使用者之間的聊天,一個使用者發到群組的訊息會被組內任何一個成員接收,下面我們來看一下群聊的基本流程
      1. 如上圖所示 , 要實現群聊,其實和單聊類似
        1. A,B,C 依然會經歷登入流程,服務端儲存使用者標識對應的 TCP 連線
        2. A 發起群聊的時候,將 A,B,C 的標識傳送至服務端,服務端拿到之後建立一個群聊 ID,然後把這個 ID 與 A,B,C 的標識繫結
        3. 群聊裡面任意一方在群裡聊天的時候,將群聊 ID 傳送至服務端,服務端拿到群聊 ID 之後,取出對應的使用者標識,遍歷使用者標識對應的 TCP 連線,就可以將訊息傳送至每一個群聊成員
  4. 群聊指令集
    1. 指令圖示

    2. 指令列表

       指令內容 | 客戶端 | 服務端
       --|
       建立群聊請求 | 傳送 | 接收
       群聊建立成功通知 | 接收 | 傳送 
       加入群聊請求 | 傳送 | 接收
       群聊加入通知 | 接收 | 傳送
       傳送群聊訊息 | 傳送 | 接收
       接收群聊訊息 | 接收 | 傳送
       退出群聊請求 | 傳送 | 接收
       退出群聊通知 | 接收 | 傳送
      
  5. Netty
    1. 我們使用Netty 統一的IO讀寫API以及強大的pipeline 來編寫業務處理邏輯 , 在後續的章節 , 我會通過IM這個例子 ,帶你瞭解Netty的一下核心知識點
      1. 服務端如何啟動
      2. 客戶端如何啟動
      3. 資料載體ByteBuf
      4. 長連自定義協議如何設計
      5. 粘包拆包原理及實踐
      6. 如何實現自定義編解碼
      7. pipeline 與 channelHandler
      8. 定時傳送心跳怎麼做
      9. 如何進行連線空閒檢測
    2. 客戶端使用Netty的程式邏輯結構
      1. 首先,客戶端會解析控制檯指令,比如傳送訊息或者建立群聊等指令
      2. 然後,客戶端會基於控制檯的輸入建立一個指令物件,使用者告訴服務端具體要幹什麼事情
      3. TCP 通訊需要的資料格式為二進位制,因此,接下來通過自定義二進位制協議將指令物件封裝成二進位制,這一步稱為協議的編碼
      4. 對於收到服務端的資料,首先需要截取出一段完整的二進位制資料包(拆包粘包相關的內容後續小節會講解)
      5. 將此二進位制資料包解析成指令物件,比如收到訊息
      6. 將指令物件宋丹對應的邏輯處理器來處理
    3. 客戶端使用Netty的程式邏輯結構