二. 學習Netty之ChannelHandlerContext

ChannelHandlerContext能夠確保一個ChannelHandler和它的pipeline和其餘的handler聯繫起來session

  1. handler能夠通知pipeline裏的下一個handler
  2. handler能夠動態的修改它的pipeline在運行時

通知: ChannelHandler能夠通知同一個ChannelPipeline 中的下一個Handler 修改 pipeline() 經過這個方法,handler能夠修改同一個ChannelPipeline最近的一個 handleride

保存上下文,之後須要的時候再用this

public class MyHandler extends ChannelHandlerAdapter {
  
       private ChannelHandlerContext ctx;
  
       public void beforeAdd(ChannelHandlerContext ctx) {
           this.ctx = ctx;
       }
  
       public void login(String username, password) {
           ctx.write(new LoginMessage(username, password));
       }
       ...
   }

3.存儲狀態類的信息 attr(AttributeKey)加密

4.一個handler能夠有不止一個的context 一個handler能夠被添加到多個pipeline,也能夠被一個pipeline添加屢次線程

public class FactorialHandler extends ChannelHandlerAdapter {
  
     private final AttributeKey<Integer> counter = AttributeKey.valueOf("counter");
  
     // This handler will receive a sequence of increasing integers starting
     // from 1.
      @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) {
       Attribute<Integer> attr = ctx.getAttr(counter);
       Integer a = ctx.getAttr(counter).get();
  
       if (a == null) {
         a = 1;
       }
  
       attr.set(a * (Integer) msg);
     }
   }
  
   // Different context objects are given to "f1", "f2", "f3", and "f4" even if
   // they refer to the same handler instance.  Because the FactorialHandler
   // stores its state in a context object (using an AttributeKey), the factorial is
   // calculated correctly 4 times once the two pipelines (p1 and p2) are active.
   FactorialHandler fh = new FactorialHandler();
  
   ChannelPipeline p1 = Channels.pipeline();
   p1.addLast("f1", fh);
   p1.addLast("f2", fh);
  
   ChannelPipeline p2 = Channels.pipeline();
   p2.addLast("f3", fh);
   p2.addLast("f4", fh);

注意: 每一個channel都有一個pipeline 每一個handler都有一個contextcode

[attr至關於就是session.一開始我有疑惑,每一個handler都有一個context, 那麼context.attr() 至關於每一個handler的attr都不同了,怎麼會像是session的功能呢? 原來,attr是附着在channel上的,而不是context上.context.attr實際上調用的仍是channel.attr] ** 上面的理解是錯誤的,不該該吧attr類比爲session. 一般,咱們怎麼標識客戶端呢?一個ip+port ,放在全局的map裏做爲key.那麼這個map才至關於session 而attr要理解爲附件,這個附近能夠是哪些東西呢,好比一個auth串, 權限驗證的東西, 加密的東西等等.**ip

一個bossGroup是一個線程組,在bind的時候建立ServerChannel,也就意味着即便這是一個線程組, 那麼只綁定一個端口的時候,那麼也只有一條線程accept用戶的接入請求。get

handler() childHandler()it

handler() 裏的handler是在bossGroup裏執行的,也就是說當只綁定一個端口的時候,這個handler是和accept在一個線程中的。而childHandler裏的handler則是在workerGroup裏執行的pip

相關文章
相關標籤/搜索