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