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()));
		// 设置一个处理客户端消息和各种消息事件的类(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());
	}
}
先运行服务端,再运行客户端,然后在服务端的控制台中打印如下字符串

Hello action.






郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。