Netty思維導圖
![Netty實戰整理](http://p2.ttnews.xyz/loading.gif)
Netty整體組成
簡單的即時通訊系統
接下來一步一步的使用Netty完成一個簡單的即時通訊系統。
選擇通訊協議
採用protobuf進行消息序列化和反序列化。
mac安裝protobuf: brew install protobuf
定義請求消息結構
requestId代表接收消息的用戶ID,requestMessage代表用戶發出的消息,type代表消息類型,可能的消息類型主要是登錄請求,消息和心跳。
![Netty實戰整理](http://p2.ttnews.xyz/loading.gif)
請求消息的結構
定義響應消息結構
responseId代表接收響應的用戶ID,responseMessage代表響應消息,type代表消息類型,可能的消息類型主要是消息和心跳。
響應消息結構
基於proto文件生成Java類
protoc ./ImRequest.proto --java_out=../java/
protoc ./ImResponse.proto --java_out=../java/
使用ProtoBuf API測試消息序列化和反序列化
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發送消息。
創建ImClient
創建ImServer
配置IdleStateHandler,服務端超過11秒鐘沒有收到客戶端的消息,會觸發IdleStateEvent事件。這個時候進行心跳檢測客戶端是否存活。
配置ProtoBuf編碼器和解碼器。
配置ImServerHandler來和ImClient進行信息交互。
創建ImServer
初始化用戶信息
一般來說,需要先註冊用戶,註冊成功之後才可以進行登錄,簡單起見,用戶信息先在客戶端啟動的時候進行初始化。
初始化兩個用戶user1和user2
用戶登錄
客戶端創建成功之後,用戶發送登錄消息給服務端,登錄成功之後,就可以發送消息給其他用戶。
發送登錄消息
服務端保存用戶Session
ImServer接收到用戶登錄消息之後,保存用戶的session到sessionMap。
處理登錄消息
用戶互發消息
客戶端調用Channel的writeAndFlush發送消息
發送消息
服務端接收到消息之後解析消息中的userId, 轉發消息給真正接收消息的用戶
服務端轉發消息
完整代碼地址
https://github.com/continuous1024/weekly-report/tree/master/netty-practice/src/main/java/com/huanyu/weekly/netty/im
閱讀更多 突破程序員 的文章