關於Netty Pipeline中Handler的執行順序問題
阿新 • • 發佈:2018-03-01
add lin 代碼 是我 copy AC encoder for enc
原文地址:http://blog.csdn.net/wgyvip/article/details/25637651
最近在學習Netty框架,根據官網的教程學著做了幾個小測試,都成功了,後面開始試著寫自己的應用的時候出了問題:Server發出的數據到達Client之後一直解碼失敗,折騰了好久,對比著官方的實例代碼一步步走,最後終於在ChannelInitializer中發現了問題。原來我是這樣寫的:
[java] view plain copy- pipeline.addLast("StringDecoder", new StringDecoder(Charset.forName("UTF-8")));
- pipeline.addLast("ServerHandler", new ServerHandler());
- pipeline.addLast("StringEncoder", new StringEncoder(Charset.forName("UTF-8")));
官網的教程是這樣寫的:
[java] view plain copy- pipeline.addLast("StringDecoder", new StringDecoder(Charset.forName("UTF-8")));
- pipeline.addLast("StringEncoder", new StringEncoder(Charset.forName("UTF-8")));
- pipeline.addLast("ServerHandler", new ServerHandler());
註意到Handler在Pipeline中的順序不一樣。在Netty文檔裏看到Handler在Pipeline中的執行順序是InboundHandler順序執行,OutboundHandler逆序執行,我原以為所謂的你須執行會從Pipeline的最後一項開始執行,所以講所有的OutboundHandler都放在了最後,為了看著方便,其實不是這樣的。在InboundHandler執行完成需要調用Outbound的時候,比如ChannelHandlerContext.write()方法,Netty是直接從該InboundHandler返回逆序的查找該InboundHandler之前的OutboundHandler,並非從Pipeline的最後一項Handler開始查找,是我的理解錯了。
剛開始學習,很多地方只是一知半解,自己說得不清不楚,還得繼續學習啊。
關於Netty Pipeline中Handler的執行順序問題