2

FrameDecoder を拡張する非常に単純なデコーダーがあります。

単純なテキスト プロトコル (常に可変長) をデコードし、'\r' が見つかるまでバッファーを読み取り、ChannelBuffer (1 つのデコードされたメッセージを含む) を返します。

テキスト プロトコル/メッセージの例:

xxxx,yyyy,zzzz\r

私は常にデコーダーを次のように stringdecoder と組み合わせます。

p.addLast("stdDecoder", new SimpleTextDecoder()); //extends FrameDecoder

p.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));

より高い tps (+/- 200tps) に達するまで、すべて問題ありません。ChannelBuffer は散発的に次のようなバッファーを返し始めます。

>xxxx,yyyxxxx,yyyy,zzzz\r

または:

>y、zzzz\r など。

デコーダー:

   public static final char END_MESSAGE = 13;

   if (buffer.readableBytes() < 6) {
          return null;
   }
   buffer.markReaderIndex();
   if (1 <= buffer.readableBytes()) {
        byte bite = buffer.readByte();
        if (bite != END_MESSAGE) {
           /* Create a new ChannelBuffer which is used for the cumulation. */
           ChannelBuffer frameBuffer = buffer.factory().getBuffer(buffer.capacity());

           /* Write  byte */
           frameBuffer.writeByte(bite);

           while (buffer.readable()) {
               /* read next byte */
               bite = buffer.readByte();
               if (bite != END_MESSAGE) {
                   frameBuffer.writeByte(bite);
               } else {
                   /* Write end message and return buffer */
                   frameBuffer.writeByte(bite);
                  return frameBuffer;
               }
           }
       } else {
           return null;
       }
    }

    /* not readable bytes return null*/
    return null;
}

編集:わかりました新しいバージョン、現在動作中..可能であれば、これに関するフィードバックをお願いします:)

public class xxxxDecoder extends FrameDecoder {
    private static final Logger log = LoggerFactory.getLogger(xxxxDecoder.class);
    public static final char END_MESSAGE = 13;
    public static final char START_MESSAGE = 83;

    //Decodes the received packets so far into a frame.
    @Override
    protected Object decode(ChannelHandlerContext ctx,
                            Channel channel,
                            ChannelBuffer buffer) throws Exception {

        /* Shortest known xxx message\r
         * 8 bytes
         */
        if (buffer.readableBytes() < 8) {
            if (Consts.DEBUG_ENABLED) {
                log.debug("YAWN... data Smaller than 8 bytes,waiting for more," + buffer.readableBytes());
            }
            /*If null is returned, it means there's not enough data yet.*/
            buffer.resetReaderIndex();
            return null;
        } else {
            log.debug("Readable bytes=" + buffer.readableBytes() + ",buffersize=" + buffer.capacity());
        }


        /* Mark the "end, i think?" of this buffer  */
        buffer.markReaderIndex();

        if (1 <= buffer.readableBytes()) {

            byte bite = buffer.readByte();
            if (bite != END_MESSAGE) {
                if (Consts.DEBUG_ENABLED) {
                    log.debug("Yipee...Found new message," + bite + ",buffersize=" + buffer.capacity());
                }

                /* Create a new ChannelBuffer which is used for the cumulation. */
                ChannelBuffer frameBuffer = buffer.factory().getBuffer(buffer.capacity());

                /* Write  byte */
                frameBuffer.writeByte(bite);

                while (buffer.readable()) {
                    /* read next byte */
                    bite = buffer.readByte();
                    if (bite != END_MESSAGE) {
                        frameBuffer.writeByte(bite);
                    } else {
                        /* Write end message and return buffer */
                        frameBuffer.writeByte(bite);
                        if (Consts.DEBUG_ENABLED) {
                            log.debug("Aha...Found end message=" + bite + ", returning complete message");
                        }
                        return frameBuffer;
                    }
                }
            } else {
                /*If null is returned, it means there's not enough data yet.*/
                buffer.resetReaderIndex();
                return null;
            }
        }

        /* not readable bytes return null*/
        buffer.resetReaderIndex();
        return null;
    }
4

0 に答える 0