Netty實戰整理

Netty思維導圖


Netty實戰整理

Netty整體組成

簡單的即時通訊系統

接下來一步一步的使用Netty完成一個簡單的即時通訊系統。

選擇通訊協議

採用protobuf進行消息序列化和反序列化。

mac安裝protobuf: brew install protobuf

定義請求消息結構

requestId代表接收消息的用戶ID,requestMessage代表用戶發出的消息,type代表消息類型,可能的消息類型主要是登錄請求,消息和心跳。


Netty實戰整理

請求消息的結構

定義響應消息結構

responseId代表接收響應的用戶ID,responseMessage代表響應消息,type代表消息類型,可能的消息類型主要是消息和心跳。

Netty實戰整理

響應消息結構

基於proto文件生成Java類

protoc ./ImRequest.proto --java_out=../java/

protoc ./ImResponse.proto --java_out=../java/

使用ProtoBuf API測試消息序列化和反序列化


Netty實戰整理

protobuf請求消息的序列化和反序列化測試

創建ImClient

配置IdleStateHandler, 客戶端10秒沒有發送消息,會觸發IdleStateEvent事件。

配置ProtoBuf編碼器和解碼器,使用Netty自帶的編碼器和解碼器,並且使用基於長度的協議通過將它的長度編碼到幀的頭部來解決TCP粘包的問題。ProtobufVarint32LengthFieldPrepender會向 ByteBuf 前追加一個 Google Protocal Buffers 的“Base128 Varints”整型的長度字段值。ProtobufVarint32FrameDecoder會根據消息中的 Google Protocol Buffers 的“Base 128 Varints”整型長度字段值動態地分割所接收到的 ByteBuf。

配置ImClientHandler來和ImServer進行信息交互。

最後獲取連接到ImServer的Channel, 通過Channel可以主動給ImServer發送消息。

Netty實戰整理

創建ImClient


創建ImServer

配置IdleStateHandler,服務端超過11秒鐘沒有收到客戶端的消息,會觸發IdleStateEvent事件。這個時候進行心跳檢測客戶端是否存活。

配置ProtoBuf編碼器和解碼器。

配置ImServerHandler來和ImClient進行信息交互。

Netty實戰整理

創建ImServer


初始化用戶信息

一般來說,需要先註冊用戶,註冊成功之後才可以進行登錄,簡單起見,用戶信息先在客戶端啟動的時候進行初始化。


Netty實戰整理

初始化兩個用戶user1和user2

用戶登錄

客戶端創建成功之後,用戶發送登錄消息給服務端,登錄成功之後,就可以發送消息給其他用戶。


Netty實戰整理

發送登錄消息

服務端保存用戶Session

ImServer接收到用戶登錄消息之後,保存用戶的session到sessionMap。


Netty實戰整理

處理登錄消息

用戶互發消息

客戶端調用Channel的writeAndFlush發送消息


Netty實戰整理

發送消息

服務端接收到消息之後解析消息中的userId, 轉發消息給真正接收消息的用戶

Netty實戰整理

服務端轉發消息

完整代碼地址

https://github.com/continuous1024/weekly-report/tree/master/netty-practice/src/main/java/com/huanyu/weekly/netty/im


分享到:


相關文章: