Android 基于Netty的消息推送方案之对象的传递(四)

时间:2021-12-10 21:58:31

在上一篇文章中《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.