您的位置:首页 > 移动开发 > Objective-C

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));
}
}

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端仍然保持他本来的状态
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: