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