【Netty】Netty 核心组件 ( ChannelHandlerContext )
文章目錄
- 一、 ChannelHandlerContext 組件
- 二、 ChannelHandlerContext 組件 debug 調試
- 三、 ChannelHandlerContext 組件 debug 調試結果分析
一、 ChannelHandlerContext 組件
1 . ChannelHandlerContext 通道處理者上下文對象 :
① 保存信息 : ChannelHandlerContext 類中保存與 Channel 通道 , ChannelHandler 通道處理者 , 相關的信息 ;
② 關聯處理者 : ChannelHandlerContext 內部維護了一個 ChannelHandler 對象 ;
2 . 相關組件對應關系 :
① 整體脈絡 : ChnnelPipeline 本質是雙向鏈表 , 每個元素都是一個 ChannelHandlerContext 對象 , 每個 ChannelHandlerContext 都對應關聯了一個 ChannelHandler 對象 ;
② ChnnelPipeline 與 ChannelHandlerContext 對應關系 : 111 個 ChannelPipeline 對應多個 ChannelHandlerContext ;
③ ChannelHandlerContext 與 ChannelHandler 對應關系 : 1:11:11:1 ;
3 . ChannelHandlerContext 常用方法 :
① 獲取通道 : 在 ChannelHandlerContext 接口中定義的方法 ;
Channel channel();② 獲取管道 : 在 ChannelHandlerContext 接口中定義的方法 ;
ChannelPipeline pipeline();③ 獲取處理器 : 在 ChannelHandlerContext 接口中定義的方法 ;
ChannelHandler handler();④ 刷新數據 : 在 ChannelHandlerContext 接口中定義的方法 ;
ChannelHandlerContext flush();⑤ 關閉通道 : 在 ChannelOutboundInvoker 接口中定義的方法 ;
ChannelFuture close();⑥ 寫出數據 : 在 ChannelOutboundInvoker 接口中定義的方法 , 作用是將數據寫出到 ChannelPipeline 管道中 ;
ChannelFuture writeAndFlush(Object msg);二、 ChannelHandlerContext 組件 debug 調試
1 . 代碼及斷點 : 運行 【Netty】使用 Netty 開發 HTTP 服務器 | 三、 HTTP 服務器代碼實現 中的 HTTP 服務器代碼 , 在用戶自定義的 HTTPServerHandler 類的 channelRead0 方法中打斷點 , 查看該方法的 ChannelHandlerContext ctx 參數信息 ;
這里只列舉部分代碼 , 在獲取 channelRead0 方法的代碼處打上斷點 , 查看 ChannelHandlerContext 類型參數信息 ;
public class HTTPServerHandler extends SimpleChannelInboundHandler<HttpObject> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {if(msg instanceof HttpRequest){ //判斷該 HttpObject msg 參數是否是 Http 請求// 在此處打斷點, 查看 ChannelHandlerContext ctx 參數的信息System.out.println(ctx.channel().remoteAddress() + " 客戶端請求數據 ... ");// ...}}//... }2 . 運行程序進入斷點 :
① debug 運行服務器程序 :
② 瀏覽器訪問 : 訪問 http://127.0.0.1:8888 地址 , 目前卡在斷點 , 無法成功獲取 HTTP 資源 ;
③ 服務器端進入斷點 : 可以查看 ChannelHandlerContext ctx 參數的具體信息 ;
三、 ChannelHandlerContext 組件 debug 調試結果分析
1 . ChannelHandlerContext 接口的具體實現類型 : 在 重寫的 SimpleChannelInboundHandler 的 protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception 方法中 , ctx 參數的實際類型是 DefaultChannelHandlerContext ;
2 . ChannelHandlerContext 雙向鏈表相關分析 :
① 雙向鏈表元素位置 : 該 ChannelHandlerContext ctx 是 ChannelPipeline 的 ChannelHandlerContext 類型雙向鏈表的一部分 , 由上一篇博客 【Netty】Netty 核心組件 ( ChannelPipeline 中的 ChannelHandlerContext 雙向鏈表分析 ) | 三、 Pipeline / ChannelPipeline 管道內雙向鏈表分析 , 分析可知 , 該 ctx 是整個雙向鏈表的第 333 個元素 ;
② 雙向鏈表前一個元素 : HttpServerCodec 服務器編解碼器 , 用于 HTTP 協議數據的編碼 , 解碼處理 ;
③ 雙向鏈表后一個元素 : 后面就是雙向鏈表尾部元素 , 是 DefaultChannelPipeline ;
④ 雙向鏈表 : DefaultChannelPipeline <-> ChannelInitializer <-> HttpServerCodec <-> SimpleChannelInboundHandler ( 自定義派生類 ) <-> DefaultChannelPipeline
貼一張沒有標注的圖 : 僅做參考 ;
總結
以上是生活随笔為你收集整理的【Netty】Netty 核心组件 ( ChannelHandlerContext )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Netty】Netty 核心组件 (
- 下一篇: 【Netty】Netty 核心组件 (