public class CustomProtocolDecoder extends CumulativeProtocolDecoder{
byte currentCmd = -1;
int currentSize = -1;
boolean isFirst = false;
@Override
protected boolean doDecode(IoSession is, ByteBuffer bb, ProtocolDecoderOutput pdo) throws Exception {
if(currentCmd == -1)
{
currentCmd = bb.get();
currentSize = Packet.getSize(currentCmd);
isFirst = true;
}
while(bb.remaining() > 0)
{
if(!isFirst)
{
currentCmd = bb.get();
currentSize = Packet.getSize(currentCmd);
}
else
isFirst = false;
//System.err.println(currentCmd + " " + bb.remaining() + " " + currentSize);
if(bb.remaining() >= currentSize - 1)
{
Packet p = PacketDecoder.decodePacket(bb, currentCmd);
pdo.write(p);
}
else
{
bb.flip();
return false;
}
}
if(bb.remaining() == 0)
return true;
else
return false;
}
}
有人看到这段代码有什么问题吗?当一次接收到许多数据包时,即使仅连接一个客户端,它们中的一个也可能在最后被截断(例如12字节而不是15字节),这显然很糟糕。
最佳答案
我发现在这里很难理解要尝试解码的协议。那里肯定看起来有点混乱;)
您是否在写一些期望在同一连接上有许多请求的东西?如果是这样,那就太棒了,这就是Mina擅长的...
通常,我希望MINA解码器会检查它是否有完整的消息,然后,如果没有,则将IoBuffer的指针返回到其在方法开始时所处的位置。
通常,完整的消息将由定界符或消息开始处的长度字段确定。
api文档中提供的示例非常好。
它正在寻找回车符+换行符的分隔符:
http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/codec/CumulativeProtocolDecoder.html
hth