mina-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From aquafina <p...@mailinator.com>
Subject Re: sending/receiving a byte[]
Date Fri, 07 Dec 2007 19:48:46 GMT

Hi Maarten,

This is very helpful. I tried, but still haven't quite figured it out

I used your code to create ByteArrayEncoder and ByteArrayDecoder verbatim.
Then write a simple ByteArrayCodecFactory

public class ByteArrayCodecFactory implements ProtocolCodecFactory {
    private ProtocolEncoder encoder;
    private ProtocolDecoder decoder;
	public ByteArrayCodecFactory(){
		encoder = new ByteArrayEncoder();
		decoder = new ByteArrayDecoder();
	}
	public ProtocolEncoder getEncoder() throws Exception{
		return encoder;
	}
	public ProtocolDecoder getDecoder() throws Exception{
		return decoder;
	}
}


when a session created, I send a byte[] from the server to the client 

public void sessionCreated(IoSession session) throws Exception {
	if( session.getTransportType() == TransportType.SOCKET ){
		((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );
		((SocketSessionConfig) session.getConfig() ).setSendBufferSize(2048);
	}
	byte[] arr = new byte[300000];
	for (int i = 0;i<arr.length;i++) arr[i] = 1;
	session.write(arr);
}

, nothing happens on the client side. Also, when I look more closely, the
encoder seems to stop at "buffer.put(bytes);" (I put a System.out.println()
after and nothing was printed).

If I want my byte[] to have a length of 300.000, should I set
in.prefixedDataAvailable(4,300000)?

Thank you very much,

Sincerely,

Khanh Nguyen


Maarten Bosteels wrote:
> 
> Hi Aquafina,
> 
> You want to send and receive byte arrays, right ?
> If the byte array can contain any byte value, you can't use a
> delimiter, so the only option I see is to use a length prefix.
> 
> Have a look at the codec tutorial
> http://mina.apache.org/tutorial-on-protocolcodecfilter.html
> 
> A Codec for encoding/decoding byte[] objects is really easy.
> The decoder would look like this:
> 
> protected boolean doDecode(IoSession session, ByteBuffer in,
> ProtocolDecoderOutput out) throws Exception {
>         if (in.prefixedDataAvailable(4)) {
>             int length = in.getInt();
>             byte[] bytes = new byte[length];
>             in.get(bytes);
>             out.write(bytes);
>             return true;
>         } else {
>           return false;
>         }
>     }
> 
> The encoder looks like this:
> 
>   public void encode(IoSession session, Object message,
> ProtocolEncoderOutput out) throws Exception {
>      byte[] bytes = (byte[]) message;
>     ByteBuffer buffer = ByteBuffer.allocate( bytes.length, false );
>     buffer.putInt(bytes.length);
>     buffer.put(bytes);
>     buffer.flip();
>     out.write(buffer);
>   }
> 
> We are using this approach to send/receive xml documents. We can't use
> strings because we don't know which encoding
> (UTF-8, UTF-16, ...) the client is going to use. We pass the byte[] to
> the xml parser, which will correctly detect the encoding specified in
> the xml itself.
> 
> HTH
> Maarten
> 
> 
> On Dec 7, 2007 5:23 AM, aquafina <plum@mailinator.com> wrote:
>>
>> Hello,
>>
>> Do I need to set ReceiveBufferSize = 300.000 if I want to send a byte
>> array
>> of 300.000 elements?
>>
>>
>>
>> Qi wrote:
>> >
>> > Hi Aquafina,
>> >
>> > I'm not a MINA expert, but as far as I know, you can wrap a byte array
>> > into ByteBuffer by using ByteBuffer.wrap(byte[] byteArray, int offset,
>> int
>> > length), and send it through IoSession.write(the ByteBuffer instance);
>> > Please be aware that by doing this, you bypass your costumized
>> > ProtocalEncoder/Decoder.
>> >
>> > Wrap a byte array into a serilizable object, just in sake of sending it
>> > alone, is a bit redundant IMHO. The wrap object will need to go through
>> > ObjectSerializationDecoder and ObjectSerializationEncoder, which add
>> some
>> > extra cost.
>> >
>> > Cheers,
>> > Qi
>> >
>> >
>> > aquafina wrote:
>> >>
>> >> Hello,
>> >>
>> >> I am new with MINA. Would anyone please show me how to configure
>> >> SocketAcceptorConfig to receive/send a byte[]. I tried to wrap it with
>> a
>> >> Serializable object and used
>> >>
>> >> cfg.getFilterChain().addLast(
>> >>                 "codec",
>> >>                 new ProtocolCodecFilter(
>> >>                         new ObjectSerializationCodecFactory()));
>> >>
>> >> but it doesn't seem to work.
>> >>
>> >> Thanks,
>> >>
>> >>
>> >>
>> >
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/sending-receiving-a-byte---tf4958040s16868.html#a14206617
>>
>> Sent from the Apache MINA Support Forum mailing list archive at
>> Nabble.com.
>>
>>
> 
> 

-- 
View this message in context: http://www.nabble.com/sending-receiving-a-byte---tf4958040s16868.html#a14219225
Sent from the Apache MINA Support Forum mailing list archive at Nabble.com.


Mime
View raw message