Netty 3.5.8-Final - Справка по FrameDecoder

У меня есть следующий код для моего фреймдекодера:

protected Object decode(ChannelHandlerContext channelHandlerContext,
        Channel channel, ChannelBuffer channelBuffer) throws Exception {

    //Header 1 + 4 length bytes
    if (channelBuffer.readableBytes() < 5) {
        return null;
    }
    System.out.println(channelBuffer.readerIndex());

    //mark the reader index
    channelBuffer.markReaderIndex();

    //extract the length bytes and convert to an int value 
    //**note: length value of the message is a decimal not hex
    StringBuilder lengthBuilder = new StringBuilder("");
    for (int ctr = 1; ctr < 5; ctr += 1) {
        lengthBuilder.append(String.format("%02x",
                channelBuffer.getByte(ctr)));
    }
    int length = Integer.parseInt(hexToASCII(lengthBuilder.toString()));
    System.out.println("This is the length: " + length);
    System.out.println("reader index: " + channelBuffer.readerIndex());
            channelBuffer.readerIndex(4);

    //get the remaining bytes
    if (channelBuffer.readableBytes() <= length) {
        channelBuffer.resetReaderIndex();
        return null;
    }

    String s = "";
    for (int ctr = 0; ctr < length + 5; ctr += 1) {
        s += (char) channelBuffer.getByte(ctr);
    }

    return s;
}

все идет нормально до строки int length = Integer.parseInt(hexToASCII(lengthBuilder.toString()));. После этой строки декодер все еще может прочитать оставшиеся байты, но теперь он использует фактическое сообщение в качестве поля длины, что приводит к ошибке исключения синтаксического анализа.

Скажем, у меня есть сообщение B0005EHELLO, где [B is the header] [0005 - actual message length] [E - header 2] [HELLO - actual message].. После анализа поля длины до целочисленного значения декодер использует первые четыре буквы фактического сообщения HELL для анализа поля длины, и создается исключение. Пожалуйста, помогите мне с этой проблемой.


person kaze    schedule 14.10.2012    source источник


Ответы (1)


Исправлено изменением readerIndex с 4 на 5.

channelBuffer.readerIndex(4);

Я также добавил сброс индекса читателя перед возвратом результата, чтобы он читал все сообщение, а не только фактическое сообщение :)

channelBuffer.readerIndex(0);
String s = "";
for (int ctr = 0; ctr < length + 5; ctr += 1) {
    s += (char) channelBuffer.getByte(ctr);
}
person kaze    schedule 14.10.2012