Android 基于Netty的消息推送方案之对象的传递(四)
2015-06-09 14:58
567 查看
在上一篇文章中《Android 基于Netty的消息推送方案之字符串的接收和发送(三)》我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuffer传递的,那么自然,Object也需要转换成ChannelBuffer来传递。好在Netty本身已经给我们写好了这样的转换工具。ObjectEncoder和ObjectDecoder,下面我们介绍一个案例。
1. 我们构造一个用来传输的对象(JavaBean)
[java] view
plaincopy
@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的代码
[java] view
plaincopy
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.再看一下服务端的代码
[java] view
plaincopy
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());
}
}
先运行服务端,再运行客户端,然后在服务端的控制台中打印如下字符串
[java] view
plaincopy
Hello action.
1. 我们构造一个用来传输的对象(JavaBean)
[java] view
plaincopy
@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的代码
[java] view
plaincopy
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.再看一下服务端的代码
[java] view
plaincopy
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());
}
}
先运行服务端,再运行客户端,然后在服务端的控制台中打印如下字符串
[java] view
plaincopy
Hello action.
相关文章推荐
- Android 基于Netty的消息推送方案之字符串的接收和发送(三)
- Android 基于Netty的消息推送方案之概念和工作原理(二)
- Android studio 常用快捷键设置
- Android基于Netty的消息推送方案(一)
- Android崩溃处理
- Android Robot介绍
- How to use Android MediaCodec encode Camera data(YUV420sp)
- Android开发资源收集
- android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
- 扫描二维码自动识别手机系统(Android/IOS)跳转不同页面
- Android打包jar给第三方引用
- android ListView之——ArrayAdapter使用
- android listVIew实现button按钮监听程序
- android轮播图,viewpager加载广告图片
- android 内存优化一
- Android -----listView的属性大全
- Android从入门到精通第四章 消息提示框与对话框
- Android 映像文件 system.img, boot.img, ramdisk.img, userdata.img.
- Android Framework 记录之一
- Android dumpstate 工具解析