2013-03-12 1 views
1

저는 현재 구축중인 응용 프로그램 용 프레임 디코더를 구현했습니다. 지금까지 코드를 실행할 때 패킷이 잘 디코딩되어 수신 된 패킷을 볼 수 있으며 올바른 것입니다. 가/** * @author 아르센 * */Netty Framedecoder 오류

public class SmpPduFrameDecoder extends FrameDecoder { 

    private static Logger logger = LoggerFactory.getLogger(SmpPduFrameDecoder.class); 


    @Override 
    protected Object decode(ChannelHandlerContext ctx, Channel channel, 
      ChannelBuffer buffer) throws Exception { 

     ChannelBuffer leFrame = null; 
     // Check the Endianness of the packet sent 
     if(buffer.order() == ByteOrder.BIG_ENDIAN){ 
      if(buffer.hasArray()){ 
       leFrame = ChannelBuffers.wrappedBuffer(ByteOrder.LITTLE_ENDIAN, buffer.array(), buffer.arrayOffset(), buffer.capacity()); 
      } 
      else{ 
       leFrame = ChannelBuffers.wrappedBuffer(buffer.toByteBuffer().order(ByteOrder.LITTLE_ENDIAN)); 
      } 
     } 

     // Read the byte length 
     // wait until the length prefix is available 
     if (leFrame.readableBytes() < 4) { 
      logger.debug("Unable to Read the Length"); 
      return null; 
     } 

     // parse the frame length (first 4 bytes) 
     int frameLength = leFrame.getInt(leFrame.readerIndex()); 
     logger.info("Packet Received Length " + frameLength); 

     // wait until the whole data is available 
     if (leFrame.readableBytes() < frameLength) { 
      logger.debug("Unable to read the full PDU received"); 
      return null; 
     } 

     leFrame.skipBytes(4); 

     int readerIndex = leFrame.readerIndex(); 
     ChannelBuffer frame = leFrame.readBytes(frameLength);  
     leFrame.readerIndex(readerIndex+frameLength); 

     byte[] byteArray = frame.array(); 
     StringBuilder sb = new StringBuilder(); 
     for(byte b : byteArray){ 
      sb.append(HexUtil.toHexString(b)); 
     } 
     logger.info("Decode Frame Received without the length " +sb.toString());   
     logger.debug("Full PDU has been read"); 
     return frame; 
    } 
} 

누군가가 말해 줄 수 잘못 eith이 무엇 :

decode() method must read at least one byte if it returned a frame (caused by: class com.smsgh.unitysmpp.Plugins.Smp.SmpPduFrameDecoder) 
    at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:434) 
    at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303) 
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:84) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:471) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:332) 
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 

이 내가 쓴 코드는 : 그러나 나는 예외를 얻고있다 내 코드 및 그 예외를 해결하는 데 도움이?

답변

1

나는이 문제를 해결했다. 버퍼를 새로운 버퍼에 복사하는 대신이 코드에서와 같이 실제 프레임 길이를 얻기 위해 swapInt를 사용해야합니다.

public class SmpPduFrameDecoder extends FrameDecoder { 

    private static Logger logger = LoggerFactory.getLogger(SmpPduFrameDecoder.class); 


    @Override 
    protected Object decode(ChannelHandlerContext ctx, Channel channel, 
      ChannelBuffer buffer) throws Exception { 

     // Read the byte length 
     // wait until the length prefix is available 
     if (buffer.readableBytes() < 4) { 
      logger.debug("Unable to Read the Length"); 
      return null; 
     } 

     // parse the frame length (first 4 bytes) 
     //int frameLength = leFrame.getInt(leFrame.readerIndex()); 
     int frameLength = ChannelBuffers.swapInt(buffer.getInt(buffer.readerIndex())); 
     logger.info("Packet Received Length " + frameLength); 

     // wait until the whole data is available 
     if (buffer.readableBytes() < frameLength) { 
      logger.debug("Unable to read the full PDU received"); 
      return null; 
     } 

     buffer.skipBytes(4); 
     ChannelBuffer frame = buffer.readBytes(frameLength); 
     buffer.readerIndex(frameLength + 4); 

     byte[] byteArray = frame.array(); 
     StringBuilder sb = new StringBuilder(); 
     for(byte b : byteArray){ 
      sb.append(HexUtil.toHexString(b)); 
     } 
     logger.info("Decode Frame Received without the length " +sb.toString());   
     logger.debug("Full PDU has been read"); 
     return frame; 
    } 
} 
관련 문제