zoukankan      html  css  js  c++  java
  • Android 基于Netty的消息推送方案之对象的传递(四)

    在上一篇文章中《Android 基于Netty的消息推送方案之字符串的接收和发送(三)》我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuffer传递的,那么自然,Object也须要转换成ChannelBuffer来传递。好在Netty本身已经给我们写好了这种转换工具。ObjectEncoder和ObjectDecoder,以下我们介绍一个案例。

    1. 我们构造一个用来传输的对象(JavaBean)

    @SuppressWarnings("serial")
    public class Command implements Serializable {
     
     
        private String actionName;
     
        public String getActionName() {
            return actionName;
        }
     
        public void setActionName(String actionName) {
            this.actionName = actionName;
        }
    }

    2.我们先看一下Client的代码

    public class ObjectClient {
    	public static void main(String args[]) {
    		ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
    		bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
    			@Override
    			public ChannelPipeline getPipeline() throws Exception {
    				return Channels.pipeline(new ObjectEncoder(), new ObjectClientHandler());
    			}
    		});
    
    		bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
    	}
    }
    
    class ObjectClientHandler extends SimpleChannelHandler {
    	/**
    	 * 当绑定到服务端的时候触发,给服务端发消息。

    */ @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { // 向服务端发送Object信息 sendObject(e.getChannel()); } /** * 发送Object * @param channel */ private void sendObject(Channel channel) { Command command = new Command(); command.setActionName("Hello action."); channel.write(command); } }

    3.再看一下服务端的代码

    public class ObjectServer {
    	public static void main(String args[]) {
    		// Server服务启动器
    		ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
    		// 设置一个处理client消息和各种消息事件的类(Handler)
    		bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
    			@Override
    			public ChannelPipeline getPipeline() throws Exception {
    				//先编码 --> 后处理自己的业务
    				return Channels.pipeline(new ObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())), new ObjectServerHandler());
    			}
    		});
    		bootstrap.bind(new InetSocketAddress(8000));
    	}
    }
    
    class ObjectServerHandler extends SimpleChannelHandler {
    	/**
    	 * 当接受到消息的时候触发
    	 */
    	@Override
    	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    		Command command = (Command) e.getMessage();
    		// 打印看看是不是我们刚才传过来的那个
    		System.out.println(command.getActionName());
    	}
    }
    
    先执行服务端,再执行client,然后在服务端的控制台中打印例如以下字符串

    Hello action.






  • 相关阅读:
    慕课网-安卓工程师初养成-1-4 练习题
    慕课网-安卓工程师初养成-1-3 使用记事本编写Java程序
    慕课网-安卓工程师初养成-1-2 开发环境搭建
    慕课网-安卓工程师初养成-1-1 Java简介
    安卓开发菜鸟初学
    Java编程——输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
    JSP三种常用注释
    语录——(摘自应届毕业生网)
    Servlet基础知识
    建议网站购物——建立一个简易购物网站,包括登录页面、商品选择页面和结账页面。
  • 原文地址:https://www.cnblogs.com/llguanli/p/6844631.html
Copyright © 2011-2022 走看看