Code example to write asynchronous server
yanky young
yanky.young at gmail.com
Mon Apr 13 11:06:12 EDT 2009
Hi:
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.
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:
in your PipelineFactory:
// this factory should be used for both client and server to setup pipeline
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();
final int xmlMessageSizeLimit = 8192; // can be modified to meet
your needs
// Add the text line codec combination first,
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
xmlMessageSizeLimit, Delimiters.nulDelimiter()));
pipeline.addLast("decoder", new MyProtocolDecoder());
pipeline.addLast("encoder", new MyProtocolEncoder());
// and then business logic.
pipeline.addLast("handler", handler);
}
and then define your own encoder and decoder:
public class MyProtocolDecoder extends StringDecoder{
//just override decode method
protected Object decode(
ChannelHandlerContext ctx, Channel channel, Object msg) throws
Exception {
String xml = super(ctx, channel, msg);
// then use any xml parser or xml binding tool to map xml to your
POJO, I use XStream as example
XStream mapper = new XStream();
mapper.alias("header", MyProtocolMessage.MyProtocolHeader.class);
mapper.alias("body", MyProtocolMessage.MyProtocolBody.class);
MyProtocolMessage protoMsg = mapper.fromXML(xml);
return protoMsg;
}
}
public class MyProtocolMessage {
MyProtocolHeader header;
MyProtocolBody body;
static class MyProtocolHeader {......}
static class MyProtocolBody {......}
}
you should do the reverse process in MyProtocolEncoder
Hope it helps.
good luck
yanky
2009/4/13 manishr22 <manishr22 at gmail.com>
>
> Hi,
>
> How I can read a chunk of data from channel using netty api? my client is
> writing every time on socket
>
> <manish> welcome to the real world</manish>
>
> 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.
>
>
> Any code snippet would be a great help.
>
> 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.
>
>
>
> Thanks in advance.
> Regards
> Manish
>
> Hi Yanky,
>
> Thanks so much for your guidance. I will look into factorial example will
> solving my problem based on this.
>
> For any further help, if needed i will post my request here.
>
> Thanks again
>
> Manish
>
>
>
> Thanks Yanky for the great answer! So nice that you are here as a
> part of the community.
>
> Cheers,
>
> — Trustin Lee, http://gleamynode.net/
>
> On Sat, Apr 11, 2009 at 3:16 AM, yanky young <yanky.young at gmail.com>
> wrote:
> > Hi:
> >
> > I am not netty expert yet. I am just trying to give some hints. In your
> > case, you are actually building a request/response protocol. And request
> and
> > response message may include quite complicated headers and body. So you
> have
> > to do some message encoding and decoding in both server side and client
> > side. You can see in netty codebase there are some out-of-box encoder and
> > decoder in handler.codec package. I suggest you take a look at
> > example.fractorial package to see how to implement your own encoder and
> > decoder for your message format which may be xml. If you are not
> sensitive
> > to message format, you can also have a look at example.localtime which
> use
> > google protobuf library as real encoder and decoder.
> >
> > good luck
> >
> > yanky
> >
> >
> >
> > 2009/4/11 manishr22 <manishr22 at gmail.com>
> >>
> >> Hi Yanky,
> >>
> >> I took the sample code from svn trunk and saw the codes too. Could you
> >> please let me know which one among given sample code will fit for the
> >> reference of my requirement.
> >>
> >> Regards,
> >> Manish
> >>
> >> Hi:
> >>
> >> Of course there are some sample code in netty project. You can just
> check
> >> out the svn trunk and see some samples in example package.
> >>
> >> good luck
> >>
> >> yanky
> >>
> >>
> >> 2009/4/10 manishr22 <manishr22 at gmail.com>
> >>
> >> >
> >> > Hi,
> >> >
> >> > I had a problem statement
> >> >
> >> > "to write an asynchronous TCP server to which multiple clients will
> >> > connect
> >> > and keep sending messages to my tcp server. My server should read the
> >> > message and send back some acknowledgment information to the client
> who
> >> > sent
> >> > the data. While reading the data at server since the message comes in
> >> > particular format i have to do some processing before sending the
> >> > response
> >> > back to client."
> >> >
> >> > say my client is sending a message structure in which it has some
> header
> >> > and then in body it has message like :
> >> >
> >> > <manish>welcome to the real world</manish>
> >> >
> >> > I was on the way to implement NIO but in between i found such a great
> >> > library netty and thought of using it. i was trying to make use of
> this
> >> > library with the given tutorial and examples but i found that tutorial
> >> > is
> >> > not good enough to solve the complex problem.
> >> >
> >> > If you can provide me some guidance or sample code that how i should
> >> > solve
> >> > my problem using netty library, that would be great.
> >> >
> >> > Thanks in advance.
> >> >
> >> > Regards
> >> > Manish
> >> > --
> >> > View this message in context:
> >> >
> >> >
> http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2615889.html
> >> > Sent from the Netty User Group mailing list archive at Nabble.com.
> >> >
> >> > _______________________________________________
> >> > netty-users mailing list
> >> > netty-users at lists.jboss.org
> >> > https://lists.jboss.org/mailman/listinfo/netty-users
> >> >
> >>
> >> _______________________________________________
> >> netty-users mailing list
> >> netty-users at lists.jboss.org
> >> https://lists.jboss.org/mailman/listinfo/netty-users
> >>
> >>
> >>
> >> --
> >> View this message in context:
> >>
> http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2617267.html
> >> Sent from the Netty User Group mailing list archive at Nabble.com.
> >>
> >> _______________________________________________
> >> netty-users mailing list
> >> netty-users at lists.jboss.org
> >> https://lists.jboss.org/mailman/listinfo/netty-users
> >
> >
> > _______________________________________________
> > netty-users mailing list
> > netty-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/netty-users
> >
> >
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
>
>
>
>
>
> --
> View this message in context:
> http://n2.nabble.com/Code-example-to-write-asynchronous-server-tp2615889p2627351.html
> Sent from the Netty User Group mailing list archive at Nabble.com.
>
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/netty-users/attachments/20090413/628e89b7/attachment.html
More information about the netty-users
mailing list