java 中 ChannelHandler的用法详解

前言:
ChannelHandler处理一个I/O event或者拦截一个I/O操作,在它的ChannelPipeline中将其递交给相邻的下一个handler。
通过继承ChannelHandlerAdapter来代替
因为这个接口有许多的方法需要实现,你或许希望通过继承ChannelHandlerAdapter来代替。
context对象
一个ChannelHandler和一个ChannelHandlerContext对象一起被提供。一个ChannelHander通过一个context对象和其所属的那个ChannelPipeline进行交互。使用context对象,ChannelHandler可以向上或者向下传递events,动态地修改pipeline,或者存储与handler相关的信息(使用AttributeKeys)。
状态管理
一个ChannelHandler经常需要存储一些状态相关的信息。最简单和推荐的方法是使用成员变量:
public interface Message {
// your methods here
}
public class DataServerHandler extends SimpleChannelInboundHandler {
private boolean loggedIn;
@Override
protected void messageReceived(ChannelHandlerContext ctx, Message message) {
Channel ch = e.getChannel();
if (message instanceof LoginMessage) {
authenticate((LoginMessage) message);
loggedIn = true;
} else (message instanceof GetDataMessage) {
if (loggedIn) {
ch.write(fetchSecret((GetDataMessage) message));
} else {
fail();
}
}
}
...
}