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

10-07 12:01