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

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

  1. @SuppressWarnings("serial")
  2. public class Command implements Serializable {
  3. private String actionName;
  4. public String getActionName() {
  5. return actionName;
  6. }
  7. public void setActionName(String actionName) {
  8. this.actionName = actionName;
  9. }
  10. }

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

  1. public class ObjectClient {
  2. public static void main(String args[]) {
  3. ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
  4. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  5. @Override
  6. public ChannelPipeline getPipeline() throws Exception {
  7. return Channels.pipeline(new ObjectEncoder(), new ObjectClientHandler());
  8. }
  9. });
  10. bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
  11. }
  12. }
  13. class ObjectClientHandler extends SimpleChannelHandler {
  14. /**
  15. * 当绑定到服务端的时候触发,给服务端发消息。
  16. */
  17. @Override
  18. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
  19. // 向服务端发送Object信息
  20. sendObject(e.getChannel());
  21. }
  22. /**
  23. * 发送Object
  24. * @param channel
  25. */
  26. private void sendObject(Channel channel) {
  27. Command command = new Command();
  28. command.setActionName("Hello action.");
  29. channel.write(command);
  30. }
  31. }

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

  1. public class ObjectServer {
  2. public static void main(String args[]) {
  3. // Server服务启动器
  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. //先编码 --> 后处理自己的业务
  10. return Channels.pipeline(new ObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())), new ObjectServerHandler());
  11. }
  12. });
  13. bootstrap.bind(new InetSocketAddress(8000));
  14. }
  15. }
  16. class ObjectServerHandler extends SimpleChannelHandler {
  17. /**
  18. * 当接受到消息的时候触发
  19. */
  20. @Override
  21. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  22. Command command = (Command) e.getMessage();
  23. // 打印看看是不是我们刚才传过来的那个
  24. System.out.println(command.getActionName());
  25. }
  26. }

先运行服务端,再运行客户端,然后在服务端的控制台中打印如下字符串

  1. Hello action.

Android 基于Netty的消息推送方案之对象的传递(四)的更多相关文章

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

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

  2. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  3. Android 基于Netty的消息推送方案之Hello World(一)

    消息推送方案(轮询.长连接) 轮询 轮询:比较简单的,最容易理解和实现的就是客户端去服务器上拉信息,信息的及时性要求越高则拉信息的频率越高.客户端拉信息的触发可以是一些事件,也可以是一个定时器,不断地 ...

  4. android基于XMPP的消息推送机制

    关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的 ...

  5. Android 几种消息推送方案总结

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...

  6. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  7. Knative 实战:基于 Kafka 实现消息推送

    作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...

  8. 基于FCM的消息推送功能

    需求背景 我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理.考虑到项目需要以及成本,我们选择使用谷歌的FCM框 ...

  9. android通过服务实现消息推送

    这里运用到的andorid知识模块主要有Notification和Service,和一个android-async-http-master开源框架 android项目中,有时会有这样一种需求:客户每隔 ...

随机推荐

  1. JS 实现 Tab标签切换功能

    Tab标签切换 效果图: HTML部分: <div class="wrap">     <ul id="tag">       < ...

  2. ORA-16018: cannot use LOG_ARCHIVE_DEST with LOG_ARCHIVE_DEST_n or DB_RECOVERY_FILE_DEST【error收集】

    之前一直没有注意一个事情, 关于设置archive归档路径设置的问题. 设置数据库为归档模式的命令: 1.首先要切换到mount状态: 2.执行alter system archivelog; 3.查 ...

  3. Qt5遇到的问题

    好久没用Qt了,今天又重新安装了一个,结果遇到不少问题 本机环境:VS2015,Qt5.7 装好后,就新建工程测试了一下,结果无法编译,提示 :-1: error: cannot open C:\Us ...

  4. intent.setFlags方法中参数值的含义

    intent.setFlags()方法中参数的含义 1.FLAG_ACTIVITY_NEW_TASK: 例如现在栈一的情况是:A    B   C(C位于栈顶),C通过intent跳转到D,并且这个I ...

  5. Oracle 存储过程介绍

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

  6. restful-----------------------------接口设计方式(一种风格)

    http动词: GET(SELECT):从服务器取出资源(一项或者多项) POST(CREATE):在服务器创建一个资源 PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)完整更新 ...

  7. NSSet和NSMutableSet 确保数据的唯一性--备

    NSSet和NSMutableSet是无序的, 但是它保证数据的唯一性.当插入相同的数据时,不会有任何效果.从内部实现来说是hash表,所以可以常数时间内查找一个数据. 1.NSSet的使用 [NSS ...

  8. MFC关于VS内存释放的定位

    全部在App中完成 1.在 App.h 头文件声明 #ifdef _DEBUGprotected:      CMemoryState m_msOld, m_msNew, m_msDiff;#endi ...

  9. SmartBusinessDevFramework架构设计-1:结构简介

    SmartBusinessDevFramework 简介 基于.net 4.0 开发的企业级系统框架 功能 1 自定义ORM.如果客官喜欢NHibernate EntityFramework ,并对其 ...

  10. XML在数据传输哪些方面会比JSON有优势,在哪些领域更加适合?

    XML 跟 JSON 的圣战,或许会成为自 vim/emacs 圣战,cli/gui 圣战等等圣战以来的又一个圣战,而所有的圣战大抵都不会有结果,因为每方都有各自的道理,谁都不服谁. 在我看来,XML ...