mina-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Brenno Hayden" <brennohay...@gmail.com>
Subject Re: ByteBuffer
Date Tue, 19 Feb 2008 17:51:10 GMT
what's link svn 2.0 ?i'm not remember
thanks
On Feb 19, 2008 12:47 PM, Brenno Hayden <brennohayden@gmail.com> wrote:

> Maarten,
>  i will consider MINA 2.0!
>
> thanks!
>
>
>
> On Feb 19, 2008 12:03 PM, Maarten Bosteels <mbosteels.dns@gmail.com>
> wrote:
>
> > Hello Brenno,
> >
> > Some comments on the code you showed:
> > * when you're starting a new project, consider using MINA 2.0
> > * your decoder isn't really decoding: it's not detecting the end of one
> > message
> >  but just copying all available bytes to a byte[]
> >  You could just as well have no ProtocolCodecFilter in your chain
> >  and handle the IoBuffer in your IoHandler
> > * I have no experience with the StreamIoHandler but I don't think it's
> > supposed
> >  to be combined with a ProtocolCodecFilter
> >
> > Either your protocol uses a fixed character encoding, and then your
> > decoder
> > could be similar to the TextLine decoder (detecting the last closing tag
> > instead of EOL)
> >
> > or your protocol must support multiple character encodings and then ...
> > I
> > don't know.
> > maybe read until you can determine the used encoding ?
> >
> > Maarten
> >
> >
> > On Feb 19, 2008 4:14 PM, Brenno Hayden <brennohayden@gmail.com> wrote:
> >
> > > Christian,
> > >  follow below my example, but there is a problem, I connect the telnet
> > and
> > > sending an array of bytes (5356000B000030390000) in the form of a hex,
> > > more
> > > in the codec does not correspond with the mesm value. Example i send
> > > (5356000B000030390000) in hex, but in console output
> > > *Console*:
> > > Server is loading....
> > > Handler.sessionOpened()
> > > b[0] = 53
> > > b[1] = 51
> > > b[2] = 53
> > > b[3] = 54
> > > b[4] = 48
> > > b[5] = 48
> > > b[6] = 48
> > > b[7] = 66
> > > b[8] = 48
> > > b[9] = 48
> > > b[10] = 48
> > > b[11] = 48
> > > b[12] = 51
> > > b[13] = 48
> > > b[14] = 51
> > > b[15] = 57
> > > b[16] = 48
> > > b[17] = 48
> > > b[18] = 48
> > > b[19] = 48
> > > b[20] = 13
> > > b[21] = 10
> > > Server.sessionClosed()
> > >
> > >
> > > *MyServer.Java*
> > >
> > > import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
> > > import org.apache.mina.transport.socket.nio.*;
> > > import codec.ByteArrayProtocolCodecFactory;
> > >
> > > public class Server {
> > >
> > > private static int TCP_PORT = 4443;
> > >
> > >    public static void main(String[] args) {
> > >
> > >        IoAcceptor acceptor = new SocketAcceptor();
> > >        IoAcceptorConfig config = new SocketAcceptorConfig();
> > >        DefaultIoFilterChainBuilder chain = config.getFilterChain();
> > >        // Bind
> > >        chain.addLast("mycode", new ProtocolCodecFilter(
> > >                new ByteArrayProtocolCodecFactory()));
> > >        try {
> > >            acceptor.bind(new InetSocketAddress(TCP_PORT), new
> > MyHandler(),
> > >                    config);
> > >        } catch (IOException e) {
> > >            // TODO Auto-generated catch block
> > >            e.printStackTrace();
> > >        }
> > >        System.out.println("Server is loading....");
> > >    }
> > > //-----------------------
> > > *MyHandler.java*
> > >
> > > import java.io.*;
> > >
> > > import org.apache.mina.common.*;
> > > import org.apache.mina.handler.StreamIoHandler;
> > >
> > > public class Handler extends StreamIoHandler {
> > >
> > >    public void sessionOpened(IoSession session) {
> > >        System.out.println("MyHandler.sessionOpened()");
> > >    }
> > >    public void messageReceived(IoSession session, Object message) {
> > >        System.out.println("MyHandler.messageReceived()");
> > >        byte[] b = (byte[])message;
> > >        for(int i=0; i<b.length; i++) {
> > >            System.out.println("b["+i+"] = "+b[i]);
> > >        }
> > >    }
> > > public void messageSent(IoSession session, Object message)  {
> > >        System.out.println("MyHandler.messageSent");
> > >    }
> > >
> > >    public void sessionClosed(IoSession session) throws Exception {
> > >        System.out.println("MyHandler.sessionClosed()");
> > >        session.close();
> > >    }
> > >
> > >    public void sessionIdle(IoSession session, IdleStatus status) {
> > >        System.out.println("MyServer.sessionIdle()");
> > >        session.close();
> > >    }
> > >
> > >
> > >    protected void processStreamIo(IoSession session, InputStream arg1,
> > >            OutputStream arg2) {
> > >        System.out.println("MyServer.processStreamIo()");
> > >
> > >
> > >    }
> > > //----------
> > > *ByteArrayProtocolCodecFactory.java*
> > >
> > > package codec;
> > >
> > > import org.apache.mina.filter.codec.ProtocolCodecFactory;
> > > import org.apache.mina.filter.codec.ProtocolDecoder;
> > > import org.apache.mina.filter.codec.ProtocolEncoder;
> > >
> > > public class ByteArrayProtocolCodecFactory implements
> > ProtocolCodecFactory
> > > {
> > >    private ProtocolEncoder encoder;
> > >    private ProtocolDecoder decoder;
> > >
> > >    public ByteArrayProtocolCodecFactory() {
> > >        encoder = new ByteArrayProtocolEnconder();
> > >        decoder = new ByteArrayProtocolDecoder();
> > >    }
> > >
> > >    public ProtocolEncoder getEncoder() throws Exception {
> > >        return encoder;
> > >    }
> > >
> > >    public ProtocolDecoder getDecoder() throws Exception {
> > >        return decoder;
> > >    }
> > > }
> > > //---
> > > *ByteArrayProtocolDecoder.java*
> > >
> > > package codec;
> > >
> > > import org.apache.mina.common.ByteBuffer;
> > > import org.apache.mina.common.IoSession;
> > > import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
> > > import org.apache.mina.filter.codec.ProtocolDecoderOutput;
> > >
> > > public class ByteArrayProtocolDecoder extends
> > CumulativeProtocolDecoder {
> > >
> > >    public ByteArrayProtocolDecoder() {
> > >    }
> > >
> > >    @Override
> > >    protected boolean doDecode(IoSession session, ByteBuffer in,
> > >            ProtocolDecoderOutput output) throws Exception {
> > >        int len = in.remaining();
> > >        byte[] data = new byte[len];
> > >        in.get(data);
> > >        output.write(data);
> > >        return true;
> > >    }
> > > }
> > > //----------
> > > *ByteArrayProtocolEnconder.java*
> > >
> > > package codec;
> > >
> > > import org.apache.mina.common.ByteBuffer;
> > > import org.apache.mina.common.IoSession;
> > > import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
> > > import org.apache.mina.filter.codec.ProtocolEncoderOutput;
> > >
> > > public class ByteArrayProtocolEnconder extends ProtocolEncoderAdapter
> > {
> > >
> > >    public ByteArrayProtocolEnconder() {
> > >
> > >    }
> > >
> > >    public void encode(IoSession session, Object message,
> > > ProtocolEncoderOutput output)
> > >            throws Exception {
> > >        byte[] bytes = (byte[]) message;
> > >        int totalLength = bytes.length;
> > >        ByteBuffer buf = ByteBuffer.allocate(totalLength);
> > >        buf.put(bytes);
> > >        buf.flip();
> > >        output.write(buf);
> > >    }
> > > }
> > >
> > > On Feb 19, 2008 10:39 AM, Christian Migowski <chrismfwrd@gmail.com>
> > wrote:
> > >
> > > > I am curious, how would that ByteArrayCodecFactory help?
> > > >
> > > > I had to deal with a protocol that hasn't neither a fixed length nor
> > a
> > > > fixed
> > > > delimiter (it is XML fragments sent directly on the wire, without
> > any
> > > > header, so the Msg was complete when i found a matching end tag to a
> > > list
> > > > of
> > > > start tags). The reason may be that i am still inexperienced with
> > the
> > > Java
> > > > way of doing things, but the solution i found was to read up to a
> > > certain
> > > > amount of bytes (using the method below), check if the message was
> > > > complete,
> > > > if not rewind the buffer to the start position and wait for the next
> > > > invocation.
> > > >
> > > > christian!
> > > >
> > > >
> > > > On 2/19/08, Maarten Bosteels <mbosteels.dns@gmail.com> wrote:
> > > > >
> > > > > Have a look at
> > > > >
> > > > >
> > > >
> > >
> > http://www.nabble.com/Re%3A-sending-receiving-a-byte---p14220485s16868.html
> > > > >
> > > > > Is your array of bytes prefixed with a length indicator ?
> > > > > If not, how do you know the end of the message ?
> > > > >
> > > > > Maybe we should add a ByteArrayCodecFactory to MINA.
> > > > >
> > > > > Maarten
> > > > >
> > > > > On Feb 19, 2008 3:19 PM, Christian Migowski <chrismfwrd@gmail.com>
> > > > wrote:
> > > > >
> > > > > > Hi,
> > > > > >
> > > > > > i stumbled over this as well some time ago. The Javadoc says
> > this
> > > > > > exception
> > > > > > happens when the ByteBuffer isn't backed by an accessible array,
> > my
> > > > > > finding
> > > > > > was it isn't guaranteed in any way it is - better do not rely
on
> > > that
> > > > > > method.
> > > > > > Fortunately you can easily rewrite your code to
> > > > > >
> > > > > >     int len = in.remaining();
> > > > > > //(i do think your usage of limit() is not what you intend to
> > do)
> > > > > >     byte[] stream = new byte[len];
> > > > > >     in.get(stream , 0, in.remaining());
> > > > > >
> > > > > >
> > > > > > hope that helps.
> > > > > > regards,
> > > > > > christian!
> > > > > >
> > > > > >
> > > > > > On 2/19/08, Brenno Hayden <brennohayden@gmail.com> wrote:
> > > > > > >
> > > > > > > Hi,
> > > > > > >
> > > > > > > I am having a difficulty in mke this cast? Can I do something?
> > > Some
> > > > > tip
> > > > > > ?
> > > > > > >
> > > > > > > *code*
> > > > > > >
> > > > > > > ByteArrayDecoder extends CumulativeProtocolDecoder {
> > > > > > >
> > > > > > > protected boolean doDecode(IoSession session, ByteBuffer
in,
> > > > > > > ProtocolDecoderOutput out) throws Exception {
> > > > > > >     if (in instanceof ByteBuffer) {
> > > > > > >      int len = in.limit();
> > > > > > >      byte[] stream = new byte[len];
> > > > > > >      //TODO
> > > > > > >      stream = in.array(); // Why ?
> > > > > > >      out.write(stream);
> > > > > > >      return true;
> > > > > > >     }else {
> > > > > > >       return false.
> > > > > > >     }
> > > > > > > }
> > > > > > >
> > > > > > > *console*:
> > > > > > >
> > > > > > > org.apache.mina.filter.codec.ProtocolDecoderException:
> > > > > > > java.lang.UnsupportedOperationException
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Thanks
> > > > > > >
> > > > > > >
> > > > > > > --
> > > > > > > ________________________
> > > > > > > Brenno Hayden F. Dantas
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> > >
> > >
> > > --
> > > ________________________
> > > Brenno Hayden F. Dantas
> > >
> >
>
>
>
> --
> ________________________
> Brenno Hayden F. Dantas




-- 
________________________
Brenno Hayden F. Dantas

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message