Android 基于Netty的消息推送方案之字符串的接收和发送(三)

在上一篇文章中《Android 基于Netty的消息推送方案之概念和工作原理(二)》 ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffer的东东。

ChannelBuffer

 Netty中的消息传递,都必须以字节的形式,以ChannelBuffer为载体传递。简单的说,就是你想直接写个字符串过去,对不起,抛异常。虽然,Netty定义的writer的接口参数是Object的,这可能也是会给新上手的朋友容易造成误会的地方。Netty源码中,是这样判断的。

[java] view plaincopy
 
  1. SendBuffer acquire(Object message) {  
  2.         if (message instanceof ChannelBuffer) {  
  3.             return acquire((ChannelBuffer) message);  
  4.         } else if (message instanceof FileRegion) {  
  5.             return acquire((FileRegion) message);  
  6.         }  
  7.    
  8.         throw new IllegalArgumentException(  
  9.                 "unsupported message type: " + message.getClass());  
  10.     }  

接下来我们写一个Demo来学习它。

服务端代码如下

[java] view plaincopy
 
  1. public class MessageServer {  
  2.     public static void main(String args[]){  
  3.         //服务启动器  
  4.         ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));  
  5.         //设置一个处理客户端消息和各种消息事件的类(Handler)  
  6.         bootstrap.setPipelineFactory(new ChannelPipelineFactory(){  
  7.             @Override  
  8.             public ChannelPipeline getPipeline() throws Exception {  
  9.                 return Channels.pipeline(new BusinessHandler());  
  10.             }             
  11.         });  
  12.         //开放8000端口供客户端连接  
  13.         bootstrap.bind(new InetSocketAddress(8000));  
  14.     }  
  15.       
  16.     private static class BusinessHandler extends SimpleChannelHandler{  
  17.         // 服务端收到客户端发送过来的消息时,触发此方法  
  18.         @Override  
  19.         public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {  
  20.             ChannelBuffer buffer = (ChannelBuffer)e.getMessage();  
  21.             System.out.println("Receive:"+buffer.toString(Charset.defaultCharset()));  
  22.             String msg = buffer.toString(Charset.defaultCharset()) + "has been processed!";  
  23.             ChannelBuffer buffer2 = ChannelBuffers.buffer(msg.length());  
  24.             buffer2.writeBytes(msg.getBytes());  
  25.             e.getChannel().write(buffer2);  
  26.         }  
  27.     }  
  28. }  

客户端代码如下

[java] view plaincopy
 
  1. public class MessageClient {  
  2.     public static void main(String args[]) {  
  3.         ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));  
  4.           
  5.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  6.             @Override  
  7.             public ChannelPipeline getPipeline() throws Exception {  
  8.                 return Channels.pipeline(new MessageClientHandler());  
  9.             }  
  10.         });  
  11.         bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));  
  12.     }  
  13.   
  14.     private static class MessageClientHandler extends SimpleChannelHandler {  
  15.         /** 
  16.          * 当绑定到服务端的时候触发,给服务端发消息。 
  17.          */  
  18.         @Override  
  19.         public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {  
  20.             // 将字符串,构造成ChannelBuffer,传递给服务端  
  21.             String msg = "Hello, I'm client.";  
  22.             ChannelBuffer buffer = ChannelBuffers.buffer(msg.length());  
  23.             buffer.writeBytes(msg.getBytes());  
  24.             e.getChannel().write(buffer);  
  25.         }  
  26.     }  
  27. }  


先启动服务端,再启动客户端,可以看到服务端打印如下字符串

[java] view plaincopy
 
  1. Receive:Hello, I'm client.  


如果你感兴趣,请继续阅读《Android 基于Netty的消息推送方案之对象的传递(四)》

原文地址:https://www.cnblogs.com/dongweiq/p/4019439.html