0
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;
    }
}

誰かがこのコードに何か問題があると思いますか?一度に大量のパケットを受信すると、クライアントが1つしか接続されていなくても、最後に1つが切断される可能性があります(たとえば、15バイトではなく12バイト)。これは明らかに悪いことです。

4

2 に答える 2

1

ここでデコードしようとしているプロトコルを理解するのは少し難しいと思います。それは間違いなくそこに少し混乱しているように見えます;)

同じ接続で多くのリクエストを期待する何かを書いていますか?もしそうなら、それから素晴らしい、それはミナが得意なことです...

通常、MINAデコーダーは、完全なメッセージを受け取ったかどうかをチェックし、受け取っていない場合は、IoBufferのポインターをメソッドの開始時に保持していた位置に戻すことを期待します。

通常、完全なメッセージは、区切り文字、またはメッセージの先頭にある長さフィールドによって決定されます。

APIドキュメントで提供されている例はかなり良いです。キャリッジリターン+改行の区切り文字を探しています:

http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/codec/CumulativeProtocolDecoder.html

hth

于 2010-05-22T18:41:22.753 に答える
0

例からいくつかの助けを借りてそれを理解しました-私は真と偽の混乱を持っていました、そして私が入力バッファの位置を追跡することになっていることに気づいていませんでした。その上、whileループが必要ないことを知りませんでした。ありがとう!

    protected boolean doDecode(IoSession is, ByteBuffer bb, ProtocolDecoderOutput pdo) throws Exception {
    int start = bb.position();
    currentCmd = bb.get();
    currentSize = Packet.getSize(currentCmd);
    //System.err.println(currentCmd + " " + bb.remaining() + " " + currentSize);
    if(bb.remaining() >= currentSize - 1)
    {
        Packet p = PacketDecoder.decodePacket(bb, currentCmd);
        pdo.write(p);
        if(bb.remaining() == 0)
            return false;
        else
            return true;
    }
    else
    {
        bb.position(start);
        return false;
    }
}
于 2010-05-22T21:43:13.707 に答える