最近接到一项新的任务,其中涉及到用netty解决粘包问题,该问题解决得很顺利。下面是一些心得体会。
我们知道,netty当中有boss线程和worker线程,通常是1对多的关系,可以理解为boss接到客户的请求之后,分配给其中一个worker去处理,如果客户过多,可能会出现一个worker服务多个客户的情况。这是背景。
按照我的理解,粘包问题解决的关键在于2点,1、接收到数据在无法得到及时解析的情况下,得有地方给它存下来;2、缓冲区指针的任意移动;恰好,这两点netty都能够很轻易的。下面是代码,因为公司的保密需求,将会隐去具体业务部分。
public class ProtocolAnaDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, Listout) throws Exception { Object decoded = null;
while(true){
decoded = decode(ctx, in);
if (decoded != null) {
out.add(decoded);
} else{
return;
}
}
}
private Object decode(ChannelHandlerContext ctx, ByteBuf in) {
//标记当前读指针位置
in.markReaderIndex();
while(in.isReadable()){
byte b = in.readByte();
//业务处理部分,如果获得一个正确的消息对象,直接返回
}
//如果没有得到任何消息对象,重置读指针位置(之前mark的位置)。 in.resetReaderIndex();
return null;
}
}