users@grizzly.java.net

Re: who can help me?how a server base grizzly receive 2MB data from client

From: Jeanfrancois Arcand <Jeanfrancois.Arcand_at_Sun.COM>
Date: Wed, 30 Jan 2008 21:20:33 -0500

Hi,

sorry for the delay...

windshome wrote:
> I write a server base grizzly,I write a client which send data to server and
> receive response from server. I send 50 bytes data and 2k data to server
> ok,but when I send 20K and 2MB data,server no response.
> I view the code of grizzly,find the ByteBuffer of a workthread capity is
> 8192,then I modify it to 81920,then 20k data can receive by server.
>
> If my Server set the init size of ByteBuffer is 81920,I think it would use
> to much memory,who can tell me some method,will dynamic just the buffer,can
> receive some bytes data ,or some MB data?

What are you doing with the bytes? Are you saving the bytes somewhere on
disk/db (freeing your memory) or you must keep them in memory?

Thanks

-- Jeanfrancois


>
>
>
> My Server's protocol parser code :
>
>
> final ProtocolFilter parserProtocolFilter = new
> ParserProtocolFilter() {
> public ProtocolParser newProtocolParser() {
> return new ProtocolParser() {
> private boolean isExpectingMoreData = false;
> private ByteBuffer byteBuffer;
> private Request message;
>
> public boolean hasMoreBytesToParse() {
> return false;
> }
>
> public boolean isExpectingMoreData() {
> return isExpectingMoreData;
> }
>
> public Object getNextMessage() {
> return message;
> }
>
> public boolean hasNextMessage() {
>
>
> ByteBuffer dup = byteBuffer.duplicate();
> System.out.println( "byteBuffer.position2()=" +
> byteBuffer.position() );
> if (byteBuffer.position() == 0){
> System.out.println("byteBuffer.position() ==
> 0");
> isExpectingMoreData = true;
> return false;
> }
> dup.flip();
>
>
> if( dup.remaining()< 4 ){
> isExpectingMoreData = true;
> return false;
> }
>
> byte[] bs = new byte[4];
> dup.get(bs);
> int len= (bs[0] << 24) + (bs[1] << 16) + (bs[2] <<
> 8) + (bs[3] << 0);
>
> if( dup.remaining() < len ){
> isExpectingMoreData = true;
> return false;
> }
> byte[] data = new byte[len];
> dup.get( data );
>
> try {
> message = new ByteRequest(data);
> } catch (Exception e) {
> e.printStackTrace();
> message=null;
> return false;
> }
> return true;
>
> }
>
> public void startBuffer(ByteBuffer bb) {
> byteBuffer = bb;
> }
>
> public boolean releaseBuffer() {
> byteBuffer = null;
> message = null;
> return false;
> }
>
> };
> }
> };
>
>
>
>
>
>
>