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
>

Reply via email to