<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [netty5筆記-總體流程分析3-ChannelHandlerContext](http://blog.csdn.net/youaremoon/article/details/50449867) [Netty4學習筆記(1)-- ChannelPipeline](http://blog.csdn.net/zxhoo/article/details/17264263) 處理鏈處理寫操作流程、Pipeline,Context和Handler的協作處理。 netty核心的概念:Channel、Buffer、Selecter ## Channel Channel是核心的一個接口,表示一個聯絡Socket的通道。通過Channel,可以對Socket進行各種操作。 ## ChannelHandler 在實際程序實現中,很少直接操作Channel,而是通過ChannelHandler來間接操縱Channel。(使用策略模式?) ### ChannelHandler的種類: ChannelHandler接口的子接口 - ChannelInboundHandler - ChannelOutboundHandler > 5.0.0.Alpha1 版本已經沒有了這兩個接口,why。4.1.5存在。 ## ChannelPipeline ChannelPipeline里有一個雙向鏈表,使用HashMap存放節點。節點類型為:ChannelHandlerContext。 是一個ChandlerHandler的鏈表。當需要對Channel進行某種處理的時候,Pipeline負責依次調用每一個Handler進行處理。(責任鏈模式?) > 每個Channel都有一個屬于自己的Pipeline.(一對一關系) ChannelPipeline的方法有很多,其中一部分是用來管理ChannelHandler的,如下面這些: ``` ChannelPipeline addFirst(String name, ChannelHandler handler); ChannelPipeline addLast(String name, ChannelHandler handler); ChannelPipeline addBefore(String baseName, String name, ChannelHandler handler); ChannelPipeline addAfter(String baseName, String name, ChannelHandler handler); ChannelPipeline remove(ChannelHandler handler); ChannelHandler remove(String name); ChannelHandler removeFirst(); ChannelHandler removeLast(); ChannelPipeline replace(ChannelHandler oldHandler, String newName, ChannelHandler newHandler); ChannelHandler replace(String oldName, String newName, ChannelHandler newHandler); ChannelHandler first(); ChannelHandler last(); ChannelHandler get(String name); ``` ### 事件的傳播 為了搞清楚事件如何在Pipeline里傳播, - 讓我們從Channel的抽象子類AbstractChannel開始: ``` public abstract class AbstractChannel extends DefaultAttributeMap implements Channel { // ... @Override public Channel write(Object msg) { return pipeline.write(msg); } // ... } ``` - 再看DefaultChannelPipeline的write()方法實現 ``` final class DefaultChannelPipeline implements ChannelPipeline { // ... @Override public ChannelFuture write(Object msg) { return tail.write(msg); } // ... } ``` 因為write是個outbound事件,所以DefaultChannelPipeline直接找到tail部分的context,調用其write()方法 - 接著看DefaultChannelHandlerContext的write()方法 ``` final class DefaultChannelHandlerContext extends DefaultAttributeMap implements ChannelHandlerContext { // ... @Override public ChannelFuture write(Object msg) { return write(msg, newPromise()); } @Override public ChannelFuture write(final Object msg, final ChannelPromise promise) { if (msg == null) { throw new NullPointerException("msg"); } validatePromise(promise, true); write(msg, false, promise); return promise; } private void write(Object msg, boolean flush, ChannelPromise promise) { DefaultChannelHandlerContext next = findContextOutbound(); next.invokeWrite(msg, promise); if (flush) { next.invokeFlush(); } } private DefaultChannelHandlerContext findContextOutbound() { DefaultChannelHandlerContext ctx = this; do { ctx = ctx.prev; } while (!ctx.outbound); return ctx; } private void invokeWrite(Object msg, ChannelPromise promise) { try { ((ChannelOutboundHandler) handler).write(this, msg, promise); } catch (Throwable t) { notifyOutboundHandlerException(t, promise); } } // ... } ``` context的write()方法沿著context鏈往前找,直至找到一個outbound類型的context為止,然后調用其invokeWrite()方法 invokeWrite()接著調用handler的write()方法: ## ChannelHandlerContext ChannelPipeline并不是直接管理ChannelHandler,而是通過ChannelHandlerContext來間接管理,這一點通過ChannelPipeline的默認實現DefaultChannelPipeline可以看出來。 調用ChannelHandlerContext#channel()方法可以得到和Context綁定的Channel,調用ChannelHandlerContext#handler()方法可以得到和Context綁定的Handler。 > 一個ChannelHandlerContext只能對應一個ChannelHander,只對應一個Channel,而一個ChannelHander則可以對應多個ChannelHandlerContext
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看