DelimiterBasedFrameDecoder, как это работает? - PullRequest
0 голосов
/ 05 июля 2011

я предполагаю, что я новичок в нетти; я пытаюсь создать клиента для внешнего сервера, этот сервер выводит сообщения, оканчивающиеся на 0x0d, поэтому я решил использовать DelimiterBasedFrameDecoder для обработки этих сообщений.

Это всего лишь тест обработчика:

public class TestHandler extends DelimiterBasedFrameDecoder {

    public TestHandler(){

        super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x0d }));

    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel ch,
            ChannelBuffer cbuf) throws Exception {


        ByteBuffer buf = ByteBuffer.allocate(cbuf.readableBytes());

        cbuf.readBytes(buf);

        byte[] data = buf.array();

        for(byte b : data){

            System.out.print(b + " ");

        }

        System.out.println();

            ...... (some other code)

     }

из этого я вижу неправильное то, что он не удаляет разделитель, как я указал в конструкторе; в конце данных byte [] у меня всегда есть 0x0d; Итак, в качестве теста я изменил разделитель в конструкторе, добавив в него значение теста, например 0x55

super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x55 }));

и работает точно так же, отличий от этого нет. Я думаю, что я использую его неправильно или читаю данные неправильно. Как правильно использовать этот класс?

Для ясности, в реальном коде из этого обработчика я создаю объект из прочитанных данных и возвращаю этот объект из метода decode (), затем у меня есть другой обработчик, расширяющий SimpleChannelHandler, который получает этот объект (он аналогичен к примеру в руководстве пользователя).

Спасибо за помощь Bye

1 Ответ

0 голосов
/ 28 августа 2011

Я думаю, что ваш метод декодирования неправильно использует часть конструктора "stripBytes".

Если вы проверите код в DelimiterBasedFrameDecoder из Netty, вы увидите следующее условие if в коде, котороеотсутствует в вашем переопределенном методе декодирования.Это приводит к тому, что байты не удаляются.

 if (stripDelimiter) {
            frame = buffer.readBytes(minFrameLength);
            buffer.skipBytes(minDelimLength);
        } else {
            frame = buffer.readBytes(minFrameLength + minDelimLength);
        }
...