1. 程式人生 > >Netty中ChannelHandler的生命週期

Netty中ChannelHandler的生命週期

在使用Netty進行網路程式設計的時候,通常需要在網路連線的不同階段進行相應的操作,比如在連線建立時,客戶端向服務端發起認證,在接收到資料時對資料內容進行解析等等。那麼,連線的不同階段在netty中如何表示呢? 這便是本文討論的內容,Netty中ChannelHandller的生命週期。 首先我們先分析小網路連線的生命週期,連線建立 ---> 資料互動 ---> 連線斷開,在資料互動階段,包括從連線中讀取資料和向連線中寫入資料。知道了連線的生命週期,就可以按圖索驥的在各個階段進行想要的操作。而在Netty中,網路連線的不同生命週期都可以通過回撥的方式來繫結相應的邏輯,這個回撥介面就是`ChannelHandler`,這裡主要我們以`ChannelInboundHandler`為例進行分析。在`ChannelInboundHandler`中定義瞭如下和生命週期相關的介面: * channelRegistered * channelUnregistered * channelActive * channelInactive * channelRead * channelReadComplete 加上在父類``中定義的兩個: * handlerAdded * handlerRemoved 這些回撥介面的呼叫書序是什麼呢?我們通過寫一個`LifeCycleHandler`來看下ChannelInboundHandler的生命週期的順序。 ```java public class LifeCycleInBoundHandler extends ChannelInboundHandlerAdapter { @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { out.println("channelRegistered: channel註冊到NioEventLoop"); super.channelRegistered(ctx); } @Override public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { out.println("channelUnregistered: channel取消和NioEventLoop的繫結"); super.channelUnregistered(ctx); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { out.println("channelActive: channel準備就緒"); super.channelActive(ctx); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { out.println("channelInactive: channel被關閉"); super.channelInactive(ctx); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { out.println("channelRead: channel中有可讀的資料" ); super.channelRead(ctx, msg); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { out.println("channelReadComplete: channel讀資料完成"); super.channelReadComplete(ctx); } @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { out.println("handlerAdded: handler被新增到channel的pipeline"); super.handlerAdded(ctx); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { out.println("handlerRemoved: handler從channel的pipeline中移除"); super.handlerRemoved(ctx); } } ``` 啟動伺服器和Client,連線成功後,斷開client的連線,Server端輸出結果如下: ``` handlerAdded: handler被新增到channel的pipeline channelRegistered: channel註冊到NioEventLoop channelActive: channel準備就緒 channelRead: channel中有可讀的資料 channelReadComplete: channel讀資料完成 channelReadComplete: channel讀資料完成 channelInactive: channel被關閉 channelUnregistered: channel取消和NioEventLoop的繫結 handlerRemoved: handler從channel的pipeline中移除 ``` 從上面結果可以知道,從連線建立到連線斷開,handler的生命週期回撥介面呼叫順序如下: ``` handlerAdded -> channelRegistered -> channelActive -> channelRead -> channelReadComplete -> channelInactive -> channelUnRegistered -> handlerRemoved ``` 下面具體說下每個回撥的具體含義: 1. handlerAdded: 新建立的連線會按照初始化策略,把handler新增到該channel的pipeline裡面,也就是channel.pipeline.addLast(new LifeCycleInBoundHandler)執行完成後的回撥; 2. channelRegistered: 當該連線分配到具體的worker執行緒後,該回調會被呼叫。 3. channelActive:channel的準備工作已經完成,所有的pipeline新增完成,並分配到具體的線上上,說明該channel準備就緒,可以使用了。 4. channelRead:客戶端向服務端發來資料,每次都會回撥此方法,表示有資料可讀; 5. channelReadComplete:服務端每次讀完一次完整的資料之後,回撥該方法,表示資料讀取完畢; 6. channelInactive:當連線斷開時,該回調會被呼叫,說明這時候底層的TCP連線已經被斷開了。 7. channelUnREgistered: 對應channelRegistered,當連線關閉後,釋放繫結的workder執行緒; 8. handlerRemoved: 對應handlerAdded,將handler從該channel的pipeline移除後的回撥方法。

相關推薦

NettyChannelHandler生命週期

在使用Netty進行網路程式設計的時候,通常需要在網路連線的不同階段進行相應的操作,比如在連線建立時,客戶端向服務端發起認證,在接收到資料時對資料內容進行解析等等。那麼,連線的不同階段在netty中如何表示呢? 這便是本文討論的內容,Netty中ChannelHandller的生命週期。 首先我們先分析小網

Vue生命週期(淺談)

Vue中的宣告週期是什麼? vue例項從建立到銷燬的過程稱之為vue的生命週期   用Vue框架,熟悉它的生命週期可以讓開發更好的進行。 首先先看看官網的圖,詳細的給出了vue的生命週期:    接下來我們就根據上面那張圖來分析分析模擬一下

C語言生命週期,作用域,預設值,記憶體區域,連結屬性

1、全域性變數:定義在函式外部的變數 生命週期:從程式執行開始建立,程式退出銷燬; 作用域:從定義該變數開始一直到檔案的結束; 預設值:0; 記憶體區域:全域性(靜態)變數區; 連結屬性:外部(可以在其他檔案中引用)。 注意:全域性變數只需在一個原始檔中定義,就可以作用

react生命週期鉤子

1、初始化時期 constroctor 2、生存期 componentWillMount  render componentDidMount 3、修改期 子傳父 props componentWillReceiveProps shouldComponentUpdate componentWill

RACSubscriber在訂閱生命週期

這一篇分析過 RACScriber 的生命週期,今天發現了一個新的問題,重新分析下在耗時操作中 RACScriber 的宣告週期。 下面的完整測試用例在這裡。 先看下正常情況訊號訂閱的例子: - (void)test1 { RACSignal *signal = [RAC

理解 Rust 生命週期

Ownership, Borrowing 與 Lifetime 共同成就了 rust 中的記憶體安全,也是 rust 語言中最精髓的創造,我們就來學習學習它們究竟是什麼,為什麼要引入這些概念。 #權力與風險共生 權力與風險往往是一同出現。如果你被授予了製作核彈的權力,那麼在你製造它時其實是面臨著諸多的風險。

androidActivity生命週期的詳細過程分析

android中Activity生命週期的詳細過程分析 Activity是安卓中相當重要的一個元件,理解它有利於我們後期更好的進行相關的開發,接下來我將演示一個demo來詳細講述Activity的生命週期過程。 首先寫兩個佈局檔案ks.xml和ks1.xml,用來實現兩個介面的跳轉,上面

Fragment在ViewPager生命週期

1.一直以來的疑問 Fragment在ViewPager到底經歷了哪些生命週期方法?到底發生了什麼? 常會TabLayout和ViewPager配合起來使用,針對這套組合,就想也做一些學習瞭解。在一個ViewPager中經常會存在多個Fragment,Fragemnt

【Taro全實踐】Taro在微信小程式生命週期

一、Taro的本身生命週期 生命週期componentWillMount在微信小程式中這一生命週期方法對應頁面的onLoad或入口檔案app中的onLaunch componentDidMount在微信小程式中這一生命週期方法對應頁面的onReady或入口檔案app中的onLaunch,在 compone

springbean生命週期

我們都知道servlet的生命週期是:例項化、初始化、接受處理請求、銷燬。 spring上下文中bean也是類似的: 我們的bean都是交給spring管理的,也就是我們將bean的建立、管理控制權都交給了spring容器也稱為IOC容器 當然IOC容器初始化時

react生命週期函式

萬物皆有生命週期。 生命週期函式指在某一個時刻元件會自動執行的函式。 render constructor也可以理解為一個生命週期函式。在元件一建立的時刻,被自動的呼叫 1、initialzation 元件初始化的時候 (constructor的呼叫

react生命週期鉤子函式? 每個都是幹什麼用的?

首先react有10個生命週期鉤子函式 掛載期 constructor 資料接收 實現繼承super(props) componentWillMount 資料掛載之前 可以操作資料 不可以操作dom componentDidMount 資料掛載

java虛擬機器JVM一個物件在堆生命週期

首先,我們都知道java中的物件都是存放在堆記憶體中的。jvm中對堆進行了劃分,也就是年輕代和老年代。 為啥要分代呢? 那麼首先看這兩個區域的區別,最大的就是回收演算法不同,年輕代對應的垃圾回收器是:Minor GC,它主要是基於複製演算法(從from區複製到to區)。 老年代則是Major

Cocos2d-x 場景生命週期函式?

在Cocos2d-x中有這麼幾個函式,非常的常見。 virtual bool init( ); virtual void onEnter( ); virtual void onEnterTransitionDidFinish( ); v

Springbean生命週期(淺顯易懂)

1、網上下的圖,以供參考 2、/**  * 建立一個測試類的UserService  * @author lion  *  */ public class UserService {     private String username;//使用者名稱     pri

Android:Fragment在ViewPager生命週期

1.一直以來的疑問 Fragment在ViewPager到底經歷了哪些生命週期方法?到底發生了什麼? 常會TabLayout和ViewPager配合起來使用,針對這套組合,就想也做一些學習瞭解。在一個ViewPager中經常會存在多個Fragment,F

Android專案Activity生命週期高效的管理方式

Activity生命週期的管理方式   在我們的開發過程中,有時候要操作Activity的全域性生命週期,故我們需要儲存Activity的生命週期,以及進行管理。如何進行存放Activity的生命週期呢? 工具類下載地址:http://download.cs

React Native component 生命週期

React Native中的component跟Android中的activity,fragment等一樣,存在生命週期,下面先給出component的生命週期圖 getDefaultProps object getDefaultProps() 執行過

AndroidActivity生命週期

    在Android中,Activity的生命週期一直是 比較重要的知識點,即使是在面試中也經常被問到。網上已經有很多人寫過介紹此內容的文章,本文只是自己的總結筆記,便於以後翻閱。首先上圖: 上面那張讓人看起來很爽的圖就是官方文件中關於Activity生命週期的演示圖,

Android Activity生命週期分析:從AActivity 到BActivity過程分析

A啟動B  A生命週期全過程1.啟動A生命週期:Activity--A: onCreate---->呼叫成功生命週期:Activity--A: onStart---->呼叫成功生命週期:Activity--A: onResume---->呼叫成功2.在A中