Hi:<br><br>You have a schema in your message. So while encoding and decoding, you have to recognize a complete request or response message. A common practice is to use another delimiter that's usually not used in protocol message to mark the boundary of different protocol messages. Fortunately, netty do has out-of-box support for this problem. You can have a look at example.telnet package and also codec.frame package to see how DelimiterBasedFrameDecoder can work for you.<br>
<br>Another consideration is that, you have a xml message, of course it is string, but you can build your own encoder and decoder to translate POJO from/to xml string and then xml string from/to ChannelBuffer. That would be better. I think it would be like this:<br>
<br>in your PipelineFactory:<br><br>// this factory should be used for both client and server to setup pipeline<br>public ChannelPipeline getPipeline() throws Exception {<br> ChannelPipeline pipeline = pipeline();<br>
<br> final int xmlMessageSizeLimit = 8192; // can be modified to meet your needs<br> // Add the text line codec combination first,<br> pipeline.addLast("framer", new DelimiterBasedFrameDecoder(<br>
xmlMessageSizeLimit, Delimiters.nulDelimiter()));<br> pipeline.addLast("decoder", new MyProtocolDecoder());<br> pipeline.addLast("encoder", new MyProtocolEncoder());<br><br>
// and then business logic.<br> pipeline.addLast("handler", handler);<br>}<br><br>and then define your own encoder and decoder:<br><br>public class MyProtocolDecoder extends StringDecoder{<br> //just override decode method<br>
protected Object decode(<br> ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {<br> String xml = super(ctx, channel, msg);<br> // then use any xml parser or xml binding tool to map xml to your POJO, I use XStream as example<br>
XStream mapper = new XStream();<br> mapper.alias("header", MyProtocolMessage.MyProtocolHeader.class);<br> mapper.alias("body", MyProtocolMessage.MyProtocolBody.class);<br> MyProtocolMessage protoMsg = mapper.fromXML(xml);<br>
return protoMsg;<br> } <br>}<br><br>public class MyProtocolMessage {<br> MyProtocolHeader header;<br> MyProtocolBody body;<br> <br> static class MyProtocolHeader {......}<br> static class MyProtocolBody {......}<br>
<br>}<br><br>you should do the reverse process in MyProtocolEncoder<br><br>Hope it helps.<br><br>good luck<br><br>yanky<br><br><br><div class="gmail_quote">2009/4/13 manishr22 <span dir="ltr"><<a href="mailto:manishr22@gmail.com">manishr22@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
Hi,<br>
<br>
How I can read a chunk of data from channel using netty api? my client is writing every time on socket<br>
<div class="im"><br>
<manish> welcome to the real world</manish><br>
<br>
</div>and my netty server needs to read the message till </manish> in one go. and then next message starting from <manish> should be read by Netty server.<br>
<br>
<br>
Any code snippet would be a great help.<br>
<br>
In my decoder if i read the message from channelbuffer using getbytes() api i see the data but not able to get i can read the whole message in one go. i do see sometime some extra message being read from channel. any reason why it should be.<br>
<div><div></div><div class="h5"><br>
<br>
<br>
Thanks in advance.<br>
Regards<br>
Manish<br>
<br>
Hi Yanky,<br>
<br>
Thanks so much for your guidance. I will look into factorial example will solving my problem based on this.<br>
<br>
For any further help, if needed i will post my request here.<br>
<br>
Thanks again<br>
<br>
Manish<br>
<br>
<br>
<br>
Thanks Yanky for the great answer! So nice that you are here as a<br>
part of the community.<br>
<br>
Cheers,<br>
<br>
Trustin Lee, <a href="http://gleamynode.net/" target="_blank">http://gleamynode.net/</a><br>
<br>
On Sat, Apr 11, 2009 at 3:16 AM, yanky young <<a href="mailto:yanky.young@gmail.com">yanky.young@gmail.com</a>> wrote:<br>
> Hi:<br>
><br>
> I am not netty expert yet. I am just trying to give some hints. In your<br>
> case, you are actually building a request/response protocol. And request and<br>
> response message may include quite complicated headers and body. So you have<br>
> to do some message encoding and decoding in both server side and client<br>
> side. You can see in netty codebase there are some out-of-box encoder and<br>
> decoder in handler.codec package. I suggest you take a look at<br>
> example.fractorial package to see how to implement your own encoder and<br>
> decoder for your message format which may be xml. If you are not sensitive<br>
> to message format, you can also have a look at example.localtime which use<br>
> google protobuf library as real encoder and decoder.<br>
><br>
> good luck<br>
><br>
> yanky<br>
><br>
><br>
><br>
> 2009/4/11 manishr22 <<a href="mailto:manishr22@gmail.com">manishr22@gmail.com</a>><br>
>><br>
>> Hi Yanky,<br>
>><br>
>> I took the sample code from svn trunk and saw the codes too. Could you<br>
>> please let me know which one among given sample code will fit for the<br>
>> reference of my requirement.<br>
>><br>
>> Regards,<br>
>> Manish<br>
>><br>
>> Hi:<br>
>><br>
>> Of course there are some sample code in netty project. You can just check<br>
>> out the svn trunk and see some samples in example package.<br>
>><br>
>> good luck<br>
>><br>
>> yanky<br>
>><br>
>><br>
>> 2009/4/10 manishr22 <<a href="mailto:manishr22@gmail.com">manishr22@gmail.com</a>><br>
>><br>
>> ><br>
>> > Hi,<br>
>> ><br>
>> > I had a problem statement<br>
>> ><br>
>> > "to write an asynchronous TCP server to which multiple clients will<br>
>> > connect<br>
>> > and keep sending messages to my tcp server. My server should read the<br>
>> > message and send back some acknowledgment information to the client who<br>
>> > sent<br>
>> > the data. While reading the data at server since the message comes in<br>
>> > particular format i have to do some processing before sending the<br>
>> > response<br>
>> > back to client."<br>
>> ><br>
>> > say my client is sending a message structure in which it has some header<br>
>> > and then in body it has message like :<br>
>> ><br>
>> > <manish>welcome to the real world</manish><br>
>> ><br>
>> > I was on the way to implement NIO but in between i found such a great<br>
>> > library netty and thought of using it. i was trying to make use of this<br>
>> > library with the given tutorial and examples but i found that tutorial<br>
>> > is<br>
>> > not good enough to solve the complex problem.<br>
>> ><br>
>> > If you can provide me some guidance or sample code that how i should<br>
>> > solve<br>
>> > my problem using netty library, that would be great.<br>
>> ><br>
>> > Thanks in advance.<br>
>> ><br>
>> > Regards<br>
>> > Manish<br>
>> > --<br>
>> > View this message in context:<br>
>> ><br>
>> > <a href="http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2615889.html" target="_blank">http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2615889.html</a><br>
>> > Sent from the Netty User Group mailing list archive at Nabble.com.<br>
>> ><br>
>> > _______________________________________________<br>
>> > netty-users mailing list<br>
>> > <a href="mailto:netty-users@lists.jboss.org">netty-users@lists.jboss.org</a><br>
>> > <a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a><br>
>> ><br>
>><br>
>> _______________________________________________<br>
>> netty-users mailing list<br>
>> <a href="mailto:netty-users@lists.jboss.org">netty-users@lists.jboss.org</a><br>
>> <a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a><br>
>><br>
>><br>
>><br>
>> --<br>
>> View this message in context:<br>
>> <a href="http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2617267.html" target="_blank">http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2617267.html</a><br>
>> Sent from the Netty User Group mailing list archive at Nabble.com.<br>
>><br>
>> _______________________________________________<br>
>> netty-users mailing list<br>
>> <a href="mailto:netty-users@lists.jboss.org">netty-users@lists.jboss.org</a><br>
>> <a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a><br>
><br>
><br>
> _______________________________________________<br>
> netty-users mailing list<br>
> <a href="mailto:netty-users@lists.jboss.org">netty-users@lists.jboss.org</a><br>
> <a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a><br>
><br>
><br>
<br>
_______________________________________________<br>
netty-users mailing list<br>
<a href="mailto:netty-users@lists.jboss.org">netty-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a><br>
<br>
<br>
<br>
<br>
<br>
--<br>
</div></div>View this message in context: <a href="http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2627351.html" target="_blank">http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2627351.html</a><br>
<div><div></div><div class="h5">Sent from the Netty User Group mailing list archive at Nabble.com.<br>
<br>
<br>
_______________________________________________<br>
netty-users mailing list<br>
<a href="mailto:netty-users@lists.jboss.org">netty-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a><br>
</div></div></blockquote></div><br>