what's link svn 2.0 ?i'm not remember thanks On Feb 19, 2008 12:47 PM, Brenno Hayden <[EMAIL PROTECTED]> wrote:
> 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 -- ________________________ Brenno Hayden F. Dantas