2010-05-22 6 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; 
} 

}이것은 MINA에 ProtocolDecoder를 작성하는 올바른 방법입니까?

사람은이 코드를 잘못 아무것도 볼? 한 번에 많은 패킷을 받으면 하나의 클라이언트 만 연결되어 있어도 그 중 하나가 마지막에 끊어 질 수 있습니다 (예 : 15 바이트 대신 12 바이트). 이는 분명히 나쁩니다.

답변

1

여기서 디코딩하려는 프로토콜을 이해하는 것이 약간 어렵다는 것을 알고 있습니다.) 거기에 조금 혼란 스러울 것 같습니다.)

동일한 연결에서 많은 요청을 기대하는 무언가를 쓰고 있습니까? 그렇다면 훌륭합니다. 미나의 장점은 무엇입니까?

일반적으로 MINA 디코더는 완전한 메시지인지 아닌지 확인한 후 IoBuffer의 포인터를 다시 반환합니다. 메서드의 개시시에 보관 유지 된 위치

일반적으로 완전한 메시지는 구분 기호 또는 메시지 시작 부분의 길이 필드에 의해 결정됩니다.

api 문서에 제공된 예제는 꽤 좋습니다. 그것은 캐리지 리턴 + 줄 바꿈의 구분을 찾고 : - 나는 진실하고 혼란 거짓했고, 몰랐

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

HTH 것은

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; 
    } 
} 
관련 문제