Sungwon Jung wrote:
> Hello! I use MINA 1.1.1 for network program.
>
> I have a problem.
>
> --
> [source]
> public class PacketAckAnalysis extends ProtocolEncoderAdapter
> {
>       Logger logger = Logger.getLogger( PacketAckAnalysis.class );
>       
>       boolean ACK_TEST = true;
>       
>       public void encode(IoSession session, Object message,
> ProtocolEncoderOutput out) throws Exception {
>               logger.debug( "encode" );
>
>               logger.debug( "send message to AP" );
>
>               APMessageAck ack = (APMessageAck)message;
>
>               ByteBuffer buffer = ByteBuffer.allocate( 9, false );
>               buffer.setAutoExpand( true );
>
>               if( ACK_TEST == true ) {
>                       buffer.put( (byte)PacketDefineAP.START );
>                       buffer.put( 
> (byte)Configuration.getInstance().getIsCipher() );
>                       buffer.put( (byte)ack.getCommand() );
>                       buffer.putInt( ack.getBufSize() );
>                       buffer.put( (byte)ack.getReserved1() );
>                       buffer.put( (byte)ack.getReserved2() );
>                       buffer.putShort( (short)ack.getKey() );
>
>                       sendAP( session, message, out, buffer );
>               } else {
>                       buffer = ack.getMessage();
>
>                       sendAP( session, message, out, buffer );
>               }
>       }
>
>       private void sendAP( IoSession session, Object message,
> ProtocolEncoderOutput out, ByteBuffer in ) {
>               logger.debug( "before flip : " + in.getHexDump() );
>               in.flip();
>               logger.debug( "after flip : " + in.getHexDump() );
>               out.write( in );
>       }
> }
> --
>
> case1) ACK_TEST is true
> it's good work.
> log is
> DEBUG (PacketAckAnalysis.java[encode]) [2007-08-13 13:37:45,156] - encode
> DEBUG (PacketAckAnalysis.java[encode]) [2007-08-13 13:37:45,156] -
> send message to AP
> DEBUG (PacketAckAnalysis.java[sendAP]) [2007-08-13 13:37:45,156] -
> before flip : 00 00 00 00 00
> DEBUG (PacketAckAnalysis.java[sendAP]) [2007-08-13 13:37:45,156] -
> after flip : AA 01 00 00 00 00 00 00 00 0A 8B
>
>
> case2) ACK_TEST is false
> server cannot send packet to client.
> log is
> DEBUG (PacketAckAnalysis.java[encode]) [2007-08-13 13:38:08,984] - encode
> DEBUG (PacketAckAnalysis.java[encode]) [2007-08-13 13:38:08,984] -
> send message to AP
> DEBUG (PacketAckAnalysis.java[sendAP]) [2007-08-13 13:38:08,984] -
> before flip : AA 01 00 00 00 00 02 00 00 0A 8B
> DEBUG (PacketAckAnalysis.java[sendAP]) [2007-08-13 13:38:08,984] -
> after flip : empty
>
>
> difference is using sendAP() function, or not using.
>
> what's the problem in my think?
>
> Thanks.
>   
Don't flip() in sendAP. Seems like ack.getMessage() returns a buffer
which has its position and limit already set correctly.

Also, you should only allocate the ByteBuffer if ACK_TEST is true since
you don't use it anyway in the else block. It's a waste of memory if
ACK_TEST is false.

if( ACK_TEST == true ) {
        ByteBuffer buffer = ByteBuffer.allocate( 9, false );
        buffer.setAutoExpand( true );

        buffer.put( (byte)PacketDefineAP.START );
        buffer.put( (byte)Configuration.getInstance().getIsCipher() );
        buffer.put( (byte)ack.getCommand() );
        buffer.putInt( ack.getBufSize() );
        buffer.put( (byte)ack.getReserved1() );
        buffer.put( (byte)ack.getReserved2() );
        buffer.putShort( (short)ack.getKey() );
        buffer.flip();

        sendAP( session, message, out, buffer );
} else {
        ByteBuffer buffer = ack.getMessage();
        sendAP( session, message, out, buffer );
}


HTH

-- 
Niklas Therning
www.spamdrain.net

Reply via email to