mina-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Maarten Bosteels" <mbosteels....@gmail.com>
Subject Re: Problem sending message length in ByteBuffer
Date Tue, 04 Dec 2007 08:18:36 GMT
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
>
>

Mime
View raw message