码迷,mamicode.com
首页 > Web开发 > 详细

netty 4.0 Object 传输

时间:2015-04-09 17:50:44      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:private   object   option   服务端 netty   

1对于服务端,

private void bindPort(int port){
EventLoopGroup workGroup = new NioEventLoopGroup();
EventLoopGroup bossGroup = new NioEventLoopGroup();
try{
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workGroup);
b.channel(NioServerSocketChannel.class)
 .option(ChannelOption.SO_BACKLOG, 128)
 .handler(new LoggingHandler(LogLevel.INFO))
 .childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new ObjectDecoder(1024*1024, 
ClassResolvers.weakCachingConcurrentResolver(
this.getClass().getClassLoader())));
ch.pipeline().addLast(new ObjectEncoder());
ch.pipeline().addLast(new ServerReqHandler());
}
});
ChannelFuture channelFuture = b.bind(port).sync();
channelFuture.channel().closeFuture().sync();
}catch(Exception e){
}finally{
workGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
class ServerReqHandler extends ChannelInboundHandlerAdapter{
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
cause.printStackTrace();
ctx.close();
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("channel active");
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)throws Exception {
ServerMsg serverMsg = (ServerMsg) msg;
System.out.println(serverMsg);
}
}

在添加自己的Handler(ServerReqHandler)之前,要添加ObjectDecoder和ObjectEncoder,

自己的Handler在接受到类之后可直接强转,这里注意,被传输的类(ServerMsg)一定要实现Serializable接口(序列化)


2.对于客户端

private void connect(int port){
EventLoopGroup workGrop = new NioEventLoopGroup();
try{
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(workGrop);
bootstrap.channel(NioSocketChannel.class)
 .option(ChannelOption.TCP_NODELAY, true)
 .handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new ObjectDecoder(1024*1024,  
ClassResolvers.weakCachingConcurrentResolver(
this.getClass().getClassLoader())));
ch.pipeline().addLast(new ObjectEncoder());
ch.pipeline().addLast(new ClientReqHandler());
}
});
ChannelFuture channelFuture = bootstrap.connect("localhost", port).sync();
channelFuture.channel().closeFuture().sync();
}catch(Exception e){
e.printStackTrace();
}finally{
workGrop.shutdownGracefully();
}
 
}
class ClientReqHandler extends ChannelInboundHandlerAdapter{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
for(int i = 0; i < 10; i++){
ServerMsg msg = parseServerMsg(i);
ctx.write(msg);
}
ctx.flush();
}
private ServerMsg parseServerMsg(int id){
ServerMsg msg = new ServerMsg();
msg.setId(id);
msg.setName(id + "");
return msg;
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)throws Exception {
cause.printStackTrace();
ctx.close();
}
}

要添加的Handler与服务端一样,
在自己的Handler(ClientReqHandler)中,发送Msg时直接用ctx 

附ServerMsg
public class ServerMsg implements Serializable {
	
	private static final long serialVersionUID = 1L;
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "id: " + id + " name: " + name;
	}
	
}


本文出自 “明镜高悬” 博客,请务必保留此出处http://chpn208.blog.51cto.com/3115852/1630524

netty 4.0 Object 传输

标签:private   object   option   服务端 netty   

原文地址:http://chpn208.blog.51cto.com/3115852/1630524

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!