In the previous article, "Android Netty-based message push scheme concept and working principle (ii)", we introduced some of the concept of Netty and working principles of the content, today we first introduce a thing called Channelbuffer.
Channelbuffer
The message passing in the Netty must be passed as a vector in bytes, in the form of Channelbuffer. Simply put, you want to write a string in the past, sorry, throw an exception. Although the interface parameters of the writer defined by Netty are object, this may also be a place where new friends can easily cause misunderstandings. Netty in the source code, this is the judgment.
Sendbuffer Acquire (Object message) { if (message instanceof Channelbuffer) { return Acquire ((Channelbuffer) message); } else if (message instanceof fileregion) { return Acquire ((fileregion) message); } throw new IllegalArgumentException ( "Unsupported message type:" + message.getclass ()); }
Next we write a demo to learn it.
The service-side code is as follows
public class Messageserver {public static void main (String args[]) {//service initiator Serverbootstrap bootstrap = new Serverbootstrap (New Nioserversocketchannelfactory (Executors.newcachedthreadpool (), Executors.newcachedthreadpool ()));// Sets a Class (Handler) bootstrap.setpipelinefactory (new Channelpipelinefactory () {@Overridepublic that handles client messages and various message events Channelpipeline Getpipeline () throws Exception {return channels.pipeline (new Businesshandler ());}}); /Open 8000-Port confession Client Connection Bootstrap.bind (new inetsocketaddress (8000));} This method is triggered when the private static class Businesshandler extends simplechannelhandler{//server receives a message sent by the client @override public void Me Ssagereceived (Channelhandlercontext ctx, messageevent e) throws Exception {Channelbuffer buffer = (channelbuffer) E . GetMessage (); System.out.println ("Receive:" +buffer.tostring (Charset.defaultcharset ())); String msg = buffer.tostring (Charset.defaultcharset ()) + "has been processed!"; Channelbuffer buffer2 = Channelbuffers.buffer (Msg.length ()); Buffer2.wrItebytes (Msg.getbytes ()); E.getchannel (). write (Buffer2); }}}
The client code is as follows
public class Messageclient {public static void main (String args[]) {Clientbootstrap bootstrap = new Clientbootstrap (New Ni Oclientsocketchannelfactory (Executors.newcachedthreadpool (), Executors.newcachedthreadpool ())); Bootstrap.setpipelinefactory (New Channelpipelinefactory () {@Overridepublic channelpipeline getpipeline () throws Exception {return channels.pipeline (new Messageclienthandler ());}); Bootstrap.connect (New Inetsocketaddress ("127.0.0.1", 8000));} private static class Messageclienthandler extends Simplechannelhandler {/** * is triggered when bound to the server, sending messages to the server. */@Overridepublic void channelconnected (Channelhandlercontext ctx, channelstateevent e) {//String, constructed as Channelbuffer, Passed to the server-side string msg = "Hello, I ' m client."; Channelbuffer buffer = Channelbuffers.buffer (Msg.length ()); Buffer.writebytes (Msg.getbytes ()); E.getchannel (). Write (buffer);}}}
Start the server first, then start the client, you can see the server print the following string
Receive:hello, I ' m client.
Android Netty-based message push scheme string receive and send (iii)