Decoder + Apache Mina

Galera, estou usando o apache mina como servidor da minha aplicacao.

abaixo o meu codigo do decoder que implementei

public class TextLineDecoder implements ProtocolDecoder {
//alguns metodos aqui!!!
   @Override
    public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
            throws Exception {
        Context ctx = getContext(session);
        int matchCount = ctx.getMatchCount();

        // tentando encontrar um padrão...
        int oldPos = in.position();
        int oldLimit = in.limit();
        while (in.hasRemaining()) {
            byte b = in.get();
            boolean matched = false;
            switch (b) {
                case '[':
                    // MENSAGEM 1
                    matchCount++;
                    matched = true;
                    break;
                case ']':
                    // MENSAGEM 2
                    matchCount++;
                    matched = true;
                    break;

                default:
                    matchCount = 0;
            }

            if (matched) {
                // encontrou um padrão !!!
                int pos = in.position();
                in.limit(pos);
                in.position(oldPos);

                ctx.append(in);

                in.limit(oldLimit);
                in.position(pos);

                if (ctx.getOverflowPosition() == 0) {
                    IoBuffer buf = ctx.getBuffer();
                    buf.flip();
                    buf.limit(buf.limit() - matchCount);
                    try {
                        writeText(session, buf.getString(ctx.getDecoder()), out);
                    } finally {
                        buf.clear();
                    }
                } else {
                    int overflowPosition = ctx.getOverflowPosition();
                    ctx.reset();
                    throw new RecoverableProtocolDecoderException(
                            "A linha é grande demais: " + overflowPosition);
                }

                oldPos = pos;
                matchCount = 0;
            }
        }

        //colocando o resto do buffer.
        in.position(oldPos);
        ctx.append(in);

        ctx.setMatchCount(matchCount);

    }
}

Esse decoder esta sendo usado para a seguinte situação:

vem assim do equipamento que conecta nele:
[0700:45896321:78]
Ate ai blza, funciona.
So que apareceu agora a seguinte situação:
[0700:5454554:5454][7878:45454:4545]
O servidor esta quebrando a string no meio e nesse caso nao pode, a informação tem que ser inteira.
Alguem tem alguma ideia de como resolver essa questao?

Att

Não se esqueça que comunicaçao via sockets TCP tem de levar em conta que nem sempre algo que o cliente envia de uma vez só chega em um único pacote no servidor.

(E é por isso que normalmente ela tem esses probleminhas chatos).

Você tem de se lembrar que, se houver alguma coisa incompleta, você vai ter de criar uma maneira de ir juntando os pedaços até ter uma mensagem completa. Por exemplo, talvez você tenha de criar uma máquina de estados.

Entao, quando eu faço um socket simples vem do jeito certo.
Quando aplico esse encoder é que vem zuado.

Att

[quote=vcsmetallica]Galera, estou usando o apache mina como servidor da minha aplicacao.
abaixo o meu codigo do decoder que implementei
Esse decoder esta sendo usado para a seguinte situação:
vem assim do equipamento que conecta nele:
[0700:45896321:78]
Ate ai blza, funciona.
So que apareceu agora a seguinte situação:
[0700:5454554:5454][7878:45454:4545]
O servidor esta quebrando a string no meio e nesse caso nao pode, a informação tem que ser inteira.
Alguem tem alguma ideia de como resolver essa questao?
Att[/quote]

Olá,

Não entendi direito, mas qual é a mensagem do seu protocolo? [0700:5454554:5454] isto é uma mensagem e [7878:45454:4545] isto é outra mensagem?
As mensagens são de tamanho fixo? Ou, existe algum delimitador [] ?

Não conheço o Apache MINA o bastante (utilizo o Netty como framework NIO), mas respondendo as perguntas que lhe fiz o MINA deve ter uma solução para o seu problema. O que parece é que esta faltando algum Decoder em sua pilha de decoders.

Veja estes pacotes do MINA que contém várias classes prontas que podem te ajudar.

org.apache.mina.filter.codec
org.apache.mina.filter.codec.demux
org.apache.mina.filter.codec.prefixedstring
org.apache.mina.filter.codec.serialization
org.apache.mina.filter.codec.statemachine
org.apache.mina.filter.codec.textline

Espero ter ajudado.