es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El descodificador LengthFieldBasedFrameDecoder causó que decode() no leyera nada pero descodificara un mensaje.

Uso LengthFieldBasedFrameDecoder para analizar mi paquete, según esta respuesta, LengthFieldBasedFrameDecoder no debería causar “decode() did not read anything but decoded a message”.

pero cuando mi aplicación se ejecuta durante un período de tiempo, aparecerá.

mi cliente enviará un mensaje de latido de seis bytes de longitud cada 5 segundos, y enviará aproximadamente cien bytes de longitud cada 10 segundos.

esos mensajes están completos, no hay pérdida.

ahí está mi código:

public class RecvDecoder extends LengthFieldBasedFrameDecoder {
    private static final int MAX_FRAME_LENGTH = 10240;
    private static final int LENGTH_FIELD_LENGTH = 4;
    private static final int LENGTH_FIELD_OFFSET = 0;
    private static final int LENGTH_ADJUSTMENT = 0;
    private static final int INITIAL_BYTES_TO_STRIP = 0;

public RecvDecoder() {
    super(ByteOrder.LITTLE_ENDIAN,
            MAX_FRAME_LENGTH,
            LENGTH_FIELD_OFFSET,
            LENGTH_FIELD_LENGTH,
            LENGTH_ADJUSTMENT,
            INITIAL_BYTES_TO_STRIP,
            true);
}

@Override
protected byte[] decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
    ByteBuf byteBuf = (ByteBuf) super.decode(ctx, in);

    if (byteBuf == null) {
        return new byte[0];
    }

    int length = byteBuf.readIntLE();

    byte[] data = new byte[length];

    byteBuf.readBytes(data, 0, length);

    byteBuf.release();
    return data;
}
}

“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándose en el código proporcionado, se está utilizando el LengthFieldBasedFrameDecoder para analizar los paquetes entrantes. Según una respuesta proporcionada en stackoverflow, este decodificador no debería causar el error decode() no leyó nada pero decodificó un mensaje.

    Sin embargo, el problema sigue ocurriendo después de que la aplicación se está ejecutando durante un período de tiempo. Parece que el cliente está enviando un mensaje de latido de seis bytes de longitud cada cinco segundos, y enviando alrededor de cien mensajes de longitud de byte cada diez segundos. Todos estos mensajes están completos y no se pierden.

    La clase RecvDecoder extiende el LengthFieldBasedFrameDecoder y tiene los siguientes parámetros:

    • MAX_FRAME_LENGTH – longitud máxima del marco decodificado.
    • LENGTH_FIELD_LENGTH – longitud del campo de longitud en bytes.
    • LENGTH_FIELD_OFFSET – bytes a omitir antes del campo de longitud.
    • LENGTH_ADJUSTMENT – el valor de compensación que se debe agregar al valor del campo de longitud.
    • INITIAL_BYTES_TO_STRIP – el número de primeros bytes que se deben eliminar del marco decodificado.

    Luego se implementa el método decode() para leer la longitud del mensaje desde el ByteBuf, leer la cantidad correspondiente de bytes para el mensaje y liberar el búfer. Si el búfer es nulo, se devuelve una matriz de bytes vacía.

    No está claro qué puede estar causando que el error ocurra después de que la aplicación se ejecuta durante cierto tiempo. Podría ser debido a una fuga de memoria u otro problema en la aplicación. Es posible que se necesiten más detalles para determinar la causa raíz del error.

Comments are closed.