Return-Path: Delivered-To: apmail-mina-dev-archive@www.apache.org Received: (qmail 39569 invoked from network); 19 Feb 2008 17:51:44 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 19 Feb 2008 17:51:44 -0000 Received: (qmail 31664 invoked by uid 500); 19 Feb 2008 17:51:37 -0000 Delivered-To: apmail-mina-dev-archive@mina.apache.org Received: (qmail 31631 invoked by uid 500); 19 Feb 2008 17:51:37 -0000 Mailing-List: contact dev-help@mina.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@mina.apache.org Delivered-To: mailing list dev@mina.apache.org Received: (qmail 31622 invoked by uid 99); 19 Feb 2008 17:51:37 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 Feb 2008 09:51:37 -0800 X-ASF-Spam-Status: No, hits=2.2 required=10.0 tests=HTML_MESSAGE,SPF_PASS,WHOIS_MYPRIVREG X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of brennohayden@gmail.com designates 209.85.162.179 as permitted sender) Received: from [209.85.162.179] (HELO el-out-1112.google.com) (209.85.162.179) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 Feb 2008 17:51:04 +0000 Received: by el-out-1112.google.com with SMTP id s27so1109150ele.12 for ; Tue, 19 Feb 2008 09:51:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; bh=BTsm/bunChH3QRzaDFI/uMgCoqewufYmJgluLfy2fjI=; b=rGCj2KLj4crExJj2HCDqrqUU/wQp6vyxnSjtF38F1vXDXkw9R8+/Qpdo9KGhtLTTjhIcj7sT+cx5z4XmsiUcrLzkpIp3T9ostt4VAsJbNHzDivkQ2lxrS13SFbUmKYrIoUmeZzC3izJuH6k4Y7JcqGRJGR0FjjcT8+TXWc55Rmk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=n1R9SUCwuSYyvWRhsLFUZaU4wqwrcYzGQI6GaO3R0eYa/952/lsMrwCE1Vefrm6t1Tw3qLE8hDe6qHTbZqpIEKcIbef/tyXNLO/c/96JNqLIH6+lNxLUfDsUJH+sD/J8QJXA79YjFVRyzOwQCGcXPh3gfrjpLBxF8bS4g2tKJxY= Received: by 10.142.213.9 with SMTP id l9mr5558503wfg.104.1203443470542; Tue, 19 Feb 2008 09:51:10 -0800 (PST) Received: by 10.142.163.9 with HTTP; Tue, 19 Feb 2008 09:51:10 -0800 (PST) Message-ID: Date: Tue, 19 Feb 2008 13:51:10 -0400 From: "Brenno Hayden" To: dev@mina.apache.org Subject: Re: ByteBuffer In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_15353_25360488.1203443470516" References: <8351c72a0802190619w2711f1e5r3986653500459e85@mail.gmail.com> <5e87acee0802190623u6fd5843au926008916f1d8a05@mail.gmail.com> <8351c72a0802190639ya17e9b3s851fae83d69a2f57@mail.gmail.com> <5e87acee0802190803h4d8bd7bck14a03b1f6c0bb672@mail.gmail.com> X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_15353_25360488.1203443470516 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline what's link svn 2.0 ?i'm not remember thanks On Feb 19, 2008 12:47 PM, Brenno Hayden wrote: > Maarten, > i will consider MINA 2.0! > > thanks! > > > > On Feb 19, 2008 12:03 PM, Maarten Bosteels > 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 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 > > 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 > > 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 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 > > > > 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 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 ------=_Part_15353_25360488.1203443470516--