2010-05-22 10 views
0
public class CustomProtocolDecoder extends CumulativeProtocolDecoder{ 
byte currentCmd = -1; 
int currentSize = -1; 
boolean isFirst = false; 
@Override 
protected boolean doDecode(IoSession is, ByteBuffer bb, ProtocolDecoderOutput pdo) throws Exception { 
     if(currentCmd == -1) 
     { 
      currentCmd = bb.get(); 
      currentSize = Packet.getSize(currentCmd); 
      isFirst = true; 
     } 
     while(bb.remaining() > 0) 
     { 
      if(!isFirst) 
      { 
       currentCmd = bb.get(); 
       currentSize = Packet.getSize(currentCmd); 
      } 
      else 
       isFirst = false; 
      //System.err.println(currentCmd + " " + bb.remaining() + " " + currentSize); 
      if(bb.remaining() >= currentSize - 1) 
      { 
       Packet p = PacketDecoder.decodePacket(bb, currentCmd); 
       pdo.write(p); 
      } 
      else 
      { 
       bb.flip(); 
       return false; 
      } 
     } 
     if(bb.remaining() == 0) 
      return true; 
     else 
      return false; 
} 

}Является ли это правильным способом написания протоколаDecoder в MINA?

Кто-нибудь видел ничего плохого в этом коде? Когда сразу поступает много пакетов, даже если подключен только один клиент, один из них может быть отключен в конце (например, 12 байтов вместо 15 байтов), что явно плохо.

ответ

1

Мне сложно понять, какой протокол вы пытаетесь расшифровать здесь. Это определенно выглядит немного смущенным;)

Вы пишете что-то, что ожидает много запросов на одно и то же соединение? Если так, то здорово, вот что у Мины хорошо ...

Обычно я ожидал, что декодер MINA будет проверять, есть ли у него полное сообщение, а затем, если нет, вернуть указатель IoBuffer обратно положение, которое оно удерживало в начале метода.

Обычно полное сообщение будет определяться разделителем или, возможно, полем длины в начале сообщения.

Пример, представленный в документах api, довольно хорош. Он ищет ограничителем возврат каретки + Line Перерыв:

http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/codec/CumulativeProtocolDecoder.html

НТН

0

Фигурные это с некоторой помощью примера - я был истинным и ложным замешательстве, и не понимал, Я должен был следить за положением входного буфера. И вдобавок ко всему, я не знал, что мне не нужен цикл while. Благодаря!

protected boolean doDecode(IoSession is, ByteBuffer bb, ProtocolDecoderOutput pdo) throws Exception { 
    int start = bb.position(); 
    currentCmd = bb.get(); 
    currentSize = Packet.getSize(currentCmd); 
    //System.err.println(currentCmd + " " + bb.remaining() + " " + currentSize); 
    if(bb.remaining() >= currentSize - 1) 
    { 
     Packet p = PacketDecoder.decodePacket(bb, currentCmd); 
     pdo.write(p); 
     if(bb.remaining() == 0) 
      return false; 
     else 
      return true; 
    } 
    else 
    { 
     bb.position(start); 
     return false; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^