Hi Brenno,
i don't know how you send your data so I cannot tell for sure. Just one
point: Keep in mind that in Java "byte" is a signed type (how very useful
that is!!!), maybe this is causing you problems.
christian!
On 2/19/08, 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
>