跟閃電俠學 Netty:Netty 即時聊天實戰與底層原理

俞超

  • 出版商: 電子工業
  • 出版日期: 2022-02-01
  • 定價: $648
  • 售價: 8.0$518
  • 語言: 簡體中文
  • 頁數: 344
  • 裝訂: 平裝
  • ISBN: 712142679X
  • ISBN-13: 9787121426797
  • 相關分類: Java 相關技術
  • 立即出貨

買這商品的人也買了...

商品描述

這是一本專門為Netty初學者打造的入門及進階學習圖書,無論你之前有沒有使用過Netty,都可以從本書中有所收獲。 本書分上下兩篇。上篇通過一個即時聊天系統的實戰案例,讓讀者能夠系統地使用一遍Netty,全面掌握Netty的知識點;下篇通過對源碼的層層剖析,讓讀者能夠掌握Netty底層原理,知其然並知其所以然,從而編寫出高性能網絡應用程序。 如果你想全面系統地學習Netty,並掌握一些性能調優方法,本書上篇可以幫助你完成這個目標。如果你想深入瞭解Netty的底層設計,編寫出更靈活高效的網絡通信程序,本書下篇可以幫助你完成這個目標。如果你從未讀過開源框架源碼,本書將是你的第一本源碼指導書,讀源碼並不難,難的是邁出這一小步,之後就能通往更廣闊的世界。

目錄大綱

版權信息
作者介紹
內容簡介
推薦語
推薦序
前言
上篇入門實戰
第1章即時聊天系統簡介
1.1 單聊流程
1.2 單聊的指令
1.2.1 指令圖示
1.2.2 指令列表
1.3 群聊流程
1.4 群聊要實現的指令集
1.4.1 指令圖示
1.4.2 指令列表
1.5 Netty
1.5.1 客戶端使用Netty的程序邏輯結構
1.5.2 服務端使用Netty的程序邏輯結構
1.6 本書實現的即時聊天形式
第2章Netty是什麼
2.1 IO編程
2.2 NIO編程
2.2.1 線程資源受限
2.2.2 線程切換效率低下
2.2.3 IO讀寫面向流
2.3 Netty編程
第3章Netty開發環境配置
3.1 Maven
3.1.1 下載
3.1.2 配置和驗證
3.2 Git
3.2.1 下載與安裝
3.2.2 配置
3.3 IntelliJ IDEA
第4章服務端啟動流程
4.1 服務端啟動最小化代碼
4.2 自動綁定遞增端口
4.3 服務端啟動的其他方法
4.3.1 handler()方法
4.3.2 attr()方法
4.3.3 childAttr()方法
4.3.4 option()方法
4.3.5 childOption()方法
4.4 總結
第5章客戶端啟動流程
5.1 客戶端啟動Demo
5.2 失敗重連
5.3 客戶端啟動的其他方法
5.3.1 attr()方法
5.3.2 option()方法
5.4 總結
5.5 思考
第6章客戶端與服務端雙向通信
6.1 客戶端發送數據到服務端
6.2 服務端讀取客戶端數據
6.3 服務端返回數據到客戶端
6.4 總結
6.5 思考
第7章數據載體ByteBuf的介紹
7.1 ByteBuf的結構
7.2 容量API
7.3 讀寫指針相關的API
7.4 讀寫API
7.5 實戰
7.6 總結
7.7 思考
第8章客戶端與服務端通信協議編解碼
8.1 什麼是客戶端與服務端的通信協議
8.2 通信協議的設計
8.3 通信協議的實現
8.3.1 Java對象
8.3.2 序列化
8.3.3 編碼:封裝成二進制數據的過程
8.3.4 解碼:解析Java對象的過程
8.4 總結
8.5 思考
第9章實現客戶端登錄
9.1 登錄流程
9.2 邏輯處理器
9.3 客戶端發送登錄請求
9.3.1 客戶端處理登錄請求
9.3.2 服務端處理登錄請求
9.4 服務端發送登錄響應
9.4.1 服務端處理登錄響應
9.4.2 客戶端處理登錄響應
9.5 總結
9.6 思考
第10章實現客戶端與服務端收發消息
10.1 收發消息對象
10.2 判斷客戶端是否登錄成功
10.3 在控制台輸入消息並發送
10.4 服務端收發消息處理
10.5 客戶端收消息處理
10.6 總結
10.7 思考
第11章Pipeline與ChannelHandler
11.1 Pipeline與ChannelHandler的構成
11.2 ChannelHandler的分類
11.3 ChannelInboundHandler的事件傳播
11.4 ChannelOutboundHandler的事件傳播
11.5 總結
11.6 思考
第12章構建客戶端與服務端的Pipeline
12.1 ChannelInboundHandlerAdapter與ChannelOutboundHandlerAdapter
12.2 ByteToMessageDecoder
12.3 SimpleChannelInboundHandler
12.4 MessageToByteEncoder
12.5 構建客戶端與服務端的Pipeline
12.6 總結
12.7 思考
第13章拆包/粘包理論與解決方案
13.1 拆包/粘包例子
13.2 為什麼會有粘包、半包現象
13.3 拆包的原理
13.4 Netty自帶的拆包器
13.4.1 固定長度的拆包器FixedLengthFrameDecoder
13.4.2 行拆包器LineBasedFrameDecoder
13.4.3 分隔符拆包器DelimiterBasedFrameDecoder
13.4.4 基於長度域的拆包器LengthFieldBasedFrameDecoder
13.5 如何使用LengthFieldBasedFrameDecoder
13.6 拒絕非本協議連接
13.7 客戶端和服務端的Pipeline結構
13.8 總結
13.9 思考
第14章ChannelHandler的生命週期
14.1 ChannelHandler的生命週期詳解
14.2 ChannelHandler生命週期各回調方法的用法舉例
14.2.1 ChannelInitializer的實現原理
14.2.2 handlerAdded()方法與handlerRemoved()方法
14.2.3 channelActive()方法與channelInActive()方法
14.2.4 channelRead()方法
14.2.5 channelReadComplete()方法
14.3 總結
14.4 思考
第15章使用ChannelHandler的熱插拔實現客戶端身份校驗
15.1 身份檢驗
15.2 移除校驗邏輯
15.3 身份校驗演示
15.3.1 有身份認證的演示
15.3.2 無身份認證的演示
15.4 總結
15.5 思考
第16章客戶端互聊的原理與實現
16.1 最終效果
16.2 一對一單聊的原理
16.3 一對一單聊的實現
16.3.1 用戶登錄狀態與Channel的綁定
16.3.2 服務端接收消息並轉發的實現
16.3.3 客戶端接收消息的邏輯處理
16.3.4 客戶端控制台登錄和發送消息
16.4 總結
16.5 思考
第17章群聊的發起與通知
17.1 最終效果
17.2 群聊的原理
17.3 控制台程序重構
17.3.1 創建控制台命令執行器
17.3.2 管理控制台命令執行器
17.4 創建群聊的實現
17.4.1 客戶端發送創建群聊請求
17.4.2 服務端處理創建群聊請求
17.4.3 客戶端處理創建群聊響應
17.5 總結
17.6 思考
第18章群聊的成員管理
18.1 最終效果
18.2 群的加入
18.2.1 在控制台添加群加入命令處理器
18.2.2 服務端處理加群請求
18.2.3 客戶端處理加群響應
18.3 群的退出
18.4 獲取群成員列表
18.4.1 在控制台添加獲取群成員列表命令處理器
18.4.2 服務端處理獲取群成員列表請求
18.4.3 客戶端處理獲取群成員列表響應
18.5 總結
18.6 思考
第19章群聊消息的收發及Netty性能優化
19.1 群聊消息的最終效果
19.2 群聊消息的收發實現
19.3 共享Handler
19.4 壓縮Handler——合併編解碼器
19.5 縮短事件傳播路徑
19.5.1 壓縮Handler——合併平行Handler
19.5.2 更改事件傳播源
19.6 減少阻塞主線程的操作
19.7 如何準確統計處理時長
19.8 總結
第20章心跳與空閒檢測
20.1 網絡問題
20.2 服務端空閒檢測
20.3 客戶端定時發心跳數據包
20.4 服務端回复心跳與客戶端空閒檢測
20.5 總結
20.6 思考
下篇源碼分析
第21章服務端啟動流程解析
21.1 服務端啟動示例
21.2 服務端啟動的核心步驟
21.3 創建服務端Channel
21.3.1 創建JDK底層Channel
21.3.2 創建Channel配置類
21.3.3 設置Channel類型為非阻塞
21.3.4 創建Channel核心組件
21.3.5 創建服務端Channel小結
21.4 初始化服務端Channel
21.4.1 設置服務端Channel的Option與Attr
21.4.2 設置客戶端Channel的Option與Attr
21.4.3 配置服務端啟動邏輯
21.4.4 初始化服務端Channel小結
21.5 註冊服務端Channel
21.5.1 調用JDK底層註冊Selector
21.5.2 回調handlerAdded事件
21.5.3 傳播channelRegistered事件
21.5.4 其他邏輯
21.5.5 註冊服務端Channel小結
21.6 綁定服務端端口
21.6.1 調用JDK底層綁定端口
21.6.2 傳播channelActive事件
21.6.3 註冊ACCEPT事件
21.6.4 綁定服務端端口小結
21.7 總結
第22章Reactor線程模型解析
22.1 NioEventLoopGroup的創建
22.1.1 確定NioEventLoop的個數
22.1.2 NioEventLoopGroup的創建總體框架
22.1.3 創建ThreadPerTaskExecutor
22.1.4 創建NioEventLoop
22.1.5 創建線程選擇器
22.1.6 NioEventLoopGroup的創建小結
22.2 NioEventLoop對應線程的創建和啟動
22.2.1 NioEventLoop的啟動入口
22.2.2 創建線程並啟動
22.3 NioEventLoop的執行流程
22.3.1 NioEventLoop的執行總體框架
22.3.2 執行一次事件輪詢
22.3.3 處理產生IO事件的Channel
22.3.4 添加任務
22.3.5 執行任務
22.3.6 NioEventLoop 的執行流程小結
22.4 總結
第23章客戶端連接接入流程解析
23.1 新連接接入的總體流程
23.2 檢測到有新連接
23.3 註冊Reactor線程
23.3.1 創建NioSocketChannel
23.3.2 設置並綁定NioSocketChannel
23.3.3 註冊Reactor 線程小結
23.4 總結
第24章解碼原理解析
24.1 粘包與拆包
24.1.1 為什麼要粘包
24.1.2 為什麼要拆包
24.2 拆包的原理
24.3 Netty中拆包的基類
24.4 拆包抽象
24.4.1 累加數據
24.4.2 將累加的數據傳遞給業務進行拆包
24.4.3 清理字節容器
24.4.4 將業務數據包傳遞給業務解碼器處理
24.5 行拆包器
24.5.1 找到換行符的位置
24.5.2 非discarding模式的處理
24.5.3 discarding模式的處理
24.6 特定分隔符拆包
24.7 LengthFieldBasedFrameDecoder進階用法
24.7.1 基於長度的拆包
24.7.2 基於長度的截斷拆包
24.7.3 基於偏移長度的拆包
24.7.4 基於可調整長度的拆包
24.7.5 基於偏移可調整長度的截斷拆包
24.7.6 基於偏移可調整變異長度的截斷拆包
24.8 LengthFieldBasedFrameDecoder源碼剖析
24.8.1 構造函數
24.8.2 實現拆包抽象
24.9 總結
第25章ChannelPipeline解析
25.1 ChannelPipeline的初始化
25.2 ChannelPipeline添加ChannelHandler
25.2.1 檢查是否有重複的Handler
25.2.2 創建節點
25.2.3 添加節點
25.2.4 回調用戶方法
25.2.5 ChannelPipeline添加ChannelHandler小結
25.3 ChannelPipeline刪除ChannelHandler
25.3.1 找到待刪除的節點
25.3.2 調整雙向鍊錶指針並刪除
25.3.3 回調用戶方法
25.3.4 ChannelPipeline刪除ChannelHandler小結
25.4 Inbound事件的傳播
25.4.1 Unsafe是什麼
25.4.2 ChannelPipeline中的HeadContext
25.4.3 ChannelPipeline中的Inbound事件傳播
25.4.4 ChannelPipeline中的TailContext
25.4.5 Inbound事件的傳播小結
25.5 Outbound事件的傳播
25.6 ChannelPipeline中異常的傳播
25.6.1 Inbound異常的傳播
25.6.2 Outbound異常的傳播
25.7 總結
第26章writeAndFlush解析
26.1 Pipeline中的標準鍊錶結構
26.2 Java對象編碼過程
26.3 write:寫隊列
26.4 flush:刷新寫隊列
26.4.1 獲得第一個需要flush的節點的數據
26.4.2 獲得自旋鎖的迭代次數
26.4.3 採用自旋方式將ByteBuf寫出JDK NIO的Channel
26.4.4 刪除該節點
26.5 writeAndFlush:寫隊列並刷新
26.6 總結
第27章本書總結
27.1 Netty是什麼
27.2 服務端和客戶端的啟動
27.3 ByteBuf
27.4 自定義協議拆包與編解碼
27.5 Handler與Pipeline
27.6 耗時操作的處理與統計
27.7 最後的話