二. 学习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

相关文章
相关标签/搜索