netty 第二章 从client 传递Object 对象到server
2016-07-28 16:52
519 查看
注意Command 类对象要implements Serializable , 从而command 对象可以序列化, 进行对象传输, 或者对象保存到磁盘上的文件
如果不序列化, 那么对象从一个jvm 传到另一个jvm 的过程中, 在脱离第一个jvm 时生命周期就到了, 则无法传到第二个jvm, 所以要序列化即串行化, 才可以传输
代码:
package third.chapter.object.transpot;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.serialization.ClassResolvers;
import org.jboss.netty.handler.codec.serialization.ObjectDecoder;
/**
* Netty的消息传递都是基于流,通过ChannelBuffer传递的,所以Object 对象也需要转换成ChannelBuffer来传递
* @author jaloli
*
*/
public class HelloServer {
public static void main(String args[]) {
// Server服务启动器
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
// 设置一个处理客户端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline()throws Exception {
return Channels.pipeline(
new ObjectDecoder(ClassResolvers.cacheDisabled(this
.getClass().getClassLoader())),
new ObjectServerHandler());
}
});
// 开放8000端口供客户端访问。
bootstrap.bind(new InetSocketAddress(8000));
}
}
如果不序列化, 那么对象从一个jvm 传到另一个jvm 的过程中, 在脱离第一个jvm 时生命周期就到了, 则无法传到第二个jvm, 所以要序列化即串行化, 才可以传输
代码:
package third.chapter.object.transpot;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.serialization.ClassResolvers;
import org.jboss.netty.handler.codec.serialization.ObjectDecoder;
/**
* Netty的消息传递都是基于流,通过ChannelBuffer传递的,所以Object 对象也需要转换成ChannelBuffer来传递
* @author jaloli
*
*/
public class HelloServer {
public static void main(String args[]) {
// Server服务启动器
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
// 设置一个处理客户端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline()throws Exception {
return Channels.pipeline(
new ObjectDecoder(ClassResolvers.cacheDisabled(this
.getClass().getClassLoader())),
new ObjectServerHandler());
}
});
// 开放8000端口供客户端访问。
bootstrap.bind(new InetSocketAddress(8000));
}
}
package third.chapter.object.transpot; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; import org.jboss.netty.handler.codec.serialization.ObjectEncoder; public class HelloClient { public static void main(String args[]) { // Client服务启动器 ClientBootstrap bootstrap = new ClientBootstrap( new NioClientSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); // 设置一个处理服务端消息和各种消息事件的类(Handler) bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline()throws Exception { return Channels.pipeline(new ObjectEncoder(), new ObjectClientHandler()); } }); // 连接到本地的8000端口的服务端 bootstrap.connect(new InetSocketAddress( "127.0.0.1", 8000)); } }
package third.chapter.object.transpot; import java.io.Serializable; /** * @author jaloli */ public class Command implements Serializable{ private static final long serialVersionUID = 7590999461767050471L; private String actionName; public String getActionName() { return actionName; } public void setActionName(String actionName) { this.actionName = actionName; } }
package third.chapter.object.transpot; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; /** * 对象传递服务端代码 * * @author jalo li */ public class ObjectServerHandler extends SimpleChannelHandler { /** * 当接受到消息的时候触发 */ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Command command = (Command) e.getMessage(); // 打印看看是不是我们刚才传过来的那个 System.out.println(command.getActionName()); } }
package third.chapter.object.transpot; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.SimpleChannelHandler; /** * 对象传递,客户端代码 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */ public class ObjectClientHandler extends SimpleChannelHandler { /** * 当绑定到服务端的时候触发,给服务端发消息。 * * @author jaloli * @alia OneCoder */ @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { // 向服务端发送Object信息 sendObject(e.getChannel()); } /** * 发送Object * * @param channel * @author jaloli */ private void sendObject(Channel channel) { Command command =new Command(); command.setActionName("Hello action."); channel.write(command);//这里write 方法的参数必须实现了Serializable 接口即序列化,否则发送到服务端对象也死了, 拿不到他的属性. 必须实现Serializable 接口,使对象到了server端仍然保持他本来的状态 } }
相关文章推荐
- 各种细的知识点(二)
- a different object with the same identifier value was already associated with the session:
- Qt之Threads和QObjects
- Qt之Threads和QObjects
- Qt之Threads和QObjects
- Objective-C中一种消息处理方法performSelector: withObject:
- PyGobject(三十五)布局容器之ShortcutsWindow
- DataInputStream && ObjectInputStream 示例
- PyGobject(三十四)布局容器之Assistant
- The type java.lang.Object cannot be resolved.It is indirectly referenced from required .class files。
- PyGobject(三十三)布局容器之ApplicationWindow
- 关于NSMutableArray 调用 addObject 方法崩溃
- PyGobject(三十二)布局容器之Window
- PyGobject(三十一)布局容器之EventBox
- Objective-C-UI控件学习之UICollectionView详解
- [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- Assigning retained object to weak property object
- java中object文档
- [GIF] Shape Objects in GIF Loop Coder
- Volley的三种基本用法StringRequest的Get和post用法以及JsonObjectRequest