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