zoukankan      html  css  js  c++  java
  • 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的消息推送方案之对象的传递(四)》

  • 相关阅读:
    单细胞测序 RNA velocity | RNA速率
    单细胞测序的应用
    Centos7.4升级到Centos7.7
    K8S部署Redis Cluster集群(三主三从模式)
    K8S部署Nacos集群
    K8S部署Kafka界面管理工具(kafkamanager)
    K8S部署Kafka集群
    K8S部署RocketMQ集群(双主双从+同步模式)
    Android Studio/IDEA Gradle wrapper/tools/plugins config errors
    Android API Level对应Android版本一览表
  • 原文地址:https://www.cnblogs.com/dongweiq/p/4019439.html
Copyright © 2011-2022 走看看