You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by Sungwon Jung <th...@gmail.com> on 2007/08/13 06:45:24 UTC

buffer.flip() problem

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.

Re: buffer.flip() problem

Posted by Niklas Therning <ni...@trillian.se>.
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