Maarten,
 i will consider MINA 2.0!

thanks!


On Feb 19, 2008 12:03 PM, Maarten Bosteels <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>
> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>
> > > 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 <[EMAIL PROTECTED]> 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

Reply via email to