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