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