mina-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Trustin Lee" <trus...@gmail.com>
Subject Re: Problem sending message length in ByteBuffer
Date Tue, 04 Dec 2007 08:29:09 GMT
Nice idea.  Please go ahead! :D

On Dec 4, 2007 5:25 PM, Niklas Therning <niklas@trillian.se> wrote:
> +1
>
>
>
> Maarten Bosteels wrote:
> > Hello all,
> >
> > Right now we have the TextLineDecoder, which always works with a delimiter.
> > Wouldn't it be a good idea to add a PrefixedStringDecoder ?
> >
> > Something like this:
> >
> > public class PrefixedStringDecoder extends CumulativeProtocolDecoder {
> >   ...
> >   public PrefixedStringDecoder(int prefixLength, int maxDataLength,
> > Charset charset) {
> >     this.prefixLength = prefixLength;
> >     this.maxDataLength = maxDataLength;
> >     this.charset = charset;
> >   }
> >
> >   protected boolean doDecode(IoSession session, ByteBuffer in,
> > ProtocolDecoderOutput out) throws Exception {
> >     if (in.prefixedDataAvailable(prefixLength, maxDataLength)) {
> >       String msg = in.getPrefixedString(prefixLength, charset.newDecoder());
> >       out.write(msg);
> >       return true;
> >     } else {
> >       return false;
> >     }
> >   }
> >
> > Maarten
> >
> > On Dec 4, 2007 8:51 AM, Niklas Therning <niklas@trillian.se> wrote:
> >
> >> guttikonda wrote:
> >>
> >>> Hi
> >>>
> >>>    I am new to Mina.I have implemented a mina server to accept connections
> >>> from tcp/ip clients.The client only accepts network byte order messages
with
> >>> message length.I figured that i can achieve it by using DataInputStream
and
> >>> DataOutputStream readUTF() and writeUTF() methods respectively.
> >>>
> >>> When receiving data from client i am successful in getting the correct one:
> >>>                                 ByteBuffer rb = (ByteBuffer)msg;
> >>>               reader = new DataInputStream(rb.asInputStream());
> >>>               String inputMsg = reader.readUTF();
> >>>
> >>> I want to achieve the same thing when sending the response.I have no idea
> >>> how i should wrap the DataOutputStream in my ByteBuffer to write it back
to
> >>> the session.If i simply write my response string back it is not producing
> >>> the message length.Can anyone please help?
> >>>
> >>>
> >>>
> >>>
> >> Maybe something like
> >>
> >> ByteArrayOutputStream baos = new ByteArrayOutputStream();
> >> DataOutputStream writer = new DataOutputStream(baos);
> >> writer.writeUTF(msg);
> >> session.write(ByteBuffer.wrap(baos.toByteArray());
> >>
> >> would work?
> >>
> >> BUT, you couldn't you simply use ByteBuffer.getPrefixedString(...) and
> >> ByteBuffer.putPrefixedString(...) instead?
> >>
> >> AND, you should be aware that the network layer may decide to deliver
> >> your message in several packets. The result is that you cannot assume
> >> that a ByteBuffer passed in to your IoHandler.messageReceived() method
> >> contains a complete message. You should look into implementing a custom
> >> ProtocolDecoder. There's a tutorial on this. The beauty of using
> >> decoder/encoder is that you will only have to deal with Strings in your
> >> IoHandler.
> >>
> >> HTH
> >> Niklas
> >>
> >>
> >>
>
>



-- 
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP Key ID: 0x0255ECA6

Mime
View raw message