ChannelHandlerContext能夠確保一個ChannelHandler和它的pipeline和其餘的handler聯繫起來session
通知: 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