1. 程式人生 > >基於netty實現單聊、群聊功能

基於netty實現單聊、群聊功能

擴容 單例模式 輔助類 數據包 字節 等等 byte 良好的 解碼

學習資料

https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521

收獲:

1. Netty 是什麽? 經過我們整個小冊的學習,我們可以了解到,Netty 其實可以看做是對 BIO 和 NIO 的封裝,並提供良好的 IO 讀寫相關的 API,另外還提供了非常多的開箱即用的 handler,工具類等等。 2. 服務端和客戶端啟動 Netty 提供了兩大啟動輔助類,ServerBootstrap 和 Bootstrap, 他們的啟動參數類似,都是分為 配置 IO 類型,配置線程模型。 配置 TCP 參數,attr 屬性。 配置 handler。server 端除了配置 handler,還需要配置 childHandler,他是定義每條連接的處理器。 3. ByteBuf 接著,我們又學習了 Netty 對二進制數據的抽象類 ByteBuf,ByteBuf 底層又可以細分為堆內存和堆外內存,它的 API 要比 jdk 提供的 ByteBuffer 要更好用,ByteBuf 所有的操作其實都是基於讀指針和寫指針來進行操作的,把申請到的一塊內存劃分為可讀區、可寫區,另外還提供了自動擴容的功能。 4. 自定義協議拆包與編解碼 通常,我們要實現客戶端與服務端的通信,需要自定義協議,說白了就是雙方商量在字節流裏面,對應位置的字節段分別表示什麽含義。 我們用的最多的協議呢就是基於長度的協議,一個協議數據包裏面包含了一個長度字段,我們在解析的時候,首先第一步就是從字節流裏面根據自定義協議截取出一個個數據包,使用的最多的拆包器就是 LengthFieldBasedFrameDecoder,只需要給他配置一些參數,即可實現自動拆包。 拆包之後呢,我們就拿到了代表字節流區段的一個個 ByteBuf,我們的解碼器的作用就是把這些個 ByteBuf 變成一個個 java 對象,這樣我們後續的 handler 就可以進行相應的邏輯的處理。 5. handler 與 pipeline Netty 對邏輯處理流的處理其實和 TCP 協議棧的思路非常類似,分為輸入和輸出,也就是 inBound 和 outBound 類型的 handler,inBound 類 handler 的添加順序與事件傳播的順序相同,而 outBound 類 handler 的添加順序與事件傳播的順序相反,這裏一定要註意。 無狀態的 handler 可以改造為單例模式,但是千萬記得要加 @ChannelHandler.Sharable 註... https://juejin.im 掘金 — 一個幫助開發者成長的社區

基於netty實現單聊、群聊功能