2014-09-12 97 views
0

我正在嘗試創建一個擁有Netty客戶端連接的類,並且能夠接收所有通道事件,如channelActive,exceptionCaught和channelRead,就像它會在管道末端。在Netty中自定義管道創建

我的類可以創建調用這樣的一個客戶端的TCP連接:

ChannelFuture cf = bootstrap.connect(address, port); 

我想知道如果我需要做的是插入我的班到通道的管道,當通道的末端被創建,但我不知道如何做到這一點,而不會丟失任何事件(即來自遠端的初始數據)。渠道管道是根據bootstrap的配置情況創建的,所以我沒有看到我能如何安排將我的課程添加到管道中。

我可以等待進行連接,然後做這樣的事情:

cf.get().pipeline().addLast(this); 

,但我不知道我的類是在這種情況下被添加到該管道很快。例如,如果我這樣做,我還會看到channelActive事件嗎?

回答

1

道歉,如果你已經知道下面的想法,但如果你沒有那麼可能會幫助(引號是從曼寧書Netty in Action這是一個偉大的書,瞭解所有的事情了Netty):

  • 類保持所述自舉通常具有處理程序配置(S) - 通常是爲了一個ServerBootstrap的初始化
  • ,其是用於面向連接的協議,如TCP上的東西,處理程序和childhandler可用

「ServerBootstrap引導ServerChannel實現,它們負責創建子通道...當新連接被接受時,將創建一個新的子通道,並且ChannelInitializer會將我們的[handler]的一個實例添加到通道的的ChannelPipeline。「

  • 當你初始化你channelpipelines您設置您的處理程序進行記錄,解碼器/編碼器,請求/響應,包括任何花哨的類SSL /分塊,文件處理等的順序
  • 請求/響應處理程序通常包含或使用其他類保存業務邏輯
  • 您可以動態地從管道中添加/刪除處理程序(如從HTTP到WebSockets的管道昇級中那樣)
  • 如果要拔出消息/中間某處的消息管道的Netty可以在ChannelHandlerContext操作,而不是管道的樂

有很好的例子,在遵循:

  • Netty的源代碼中有一個例子GitHub上的文件夾
  • NettyInAction具有實例本書
  • Heiko Rupp's blog有一些容易遵循的例子
0

如果添加的處理程序一個通道初始化器,它會得到所有的事件。