首页 > 代码库 > Netty实战-对象编解码,Netty对象网络传递

Netty实战-对象编解码,Netty对象网络传递

书籍推荐:

       实例代码 : http://download.csdn.net/detail/jiangtao_st/7677503

  1. Server端代码
    <span style="font-size:12px;">/**
     * 
     * <p>
     * 	Netty Server Simple
     * </p>
     * 
     * LineBasedFrameDecoder + 消息中得换行符
     * 	
     * @author 卓轩
     * @创建时间:2014年7月7日
     * @version: V1.0
     */
    
    public class NettyServer {
    	
    	private final int port = 8989;
    	
    	@Test
    	public void nettyServer(){
    		
    		EventLoopGroup bossGroup = new NioEventLoopGroup();
    		EventLoopGroup workerGroup = new NioEventLoopGroup();
    		
    		try {
    			ServerBootstrap serverBootstrap = new ServerBootstrap();
    			serverBootstrap.group(bossGroup,workerGroup)
    				.channel(NioServerSocketChannel.class)
    				.option(ChannelOption.SO_BACKLOG, 1024)
    				.childHandler(new ChildChannelHandler());
    			
    			//绑定端口、同步等待
    			ChannelFuture futrue = serverBootstrap.bind(port).sync();
    			
    			//等待服务监听端口关闭
    			futrue.channel().closeFuture().sync();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			//退出,释放线程等相关资源
    			bossGroup.shutdownGracefully();
    			workerGroup.shutdownGracefully();
    		}
    
    		
    	}
    
    	private class ChildChannelHandler extends ChannelInitializer<SocketChannel>{
    		@Override
    		protected void initChannel(SocketChannel ch) throws Exception {
    			//ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
    //			
    //			ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes());
    //			ch.pipeline().addLast(new DelimiterBasedFrameDecoder(2048, delimiter));
    //			
    			//ch.pipeline().addLast(new FixedLengthFrameDecoder(20));
    			ch.pipeline().addLast(new ObjectDecoder(1024*1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
    			ch.pipeline().addLast(new ObjectEncoder());
    			ch.pipeline().addLast(new StringDecoder());
    			ch.pipeline().addLast(new UserRespServerHandler());
    		}
    	}
    	
    	
    }</span>
  2. Client端代码
    <span style="font-size:12px;">/**
     * 
     * <p>
     * 	NettyClient  实现
     * </p>
     * 
     * @author 卓轩
     * @创建时间:2014年7月7日
     * @version: V1.0
     */
    public class NettyClient {
    
    	
    	
    	public void connect(int port,String host){
    		
    		EventLoopGroup group = new NioEventLoopGroup();
    		
    		try {
    			Bootstrap bootstrap = new Bootstrap();
    			bootstrap.group(group)
    			.channel(NioSocketChannel.class)
    			.option(ChannelOption.TCP_NODELAY, true)
    			.handler(new ChannelInitializer<SocketChannel>() {
    
    				@Override
    				protected void initChannel(SocketChannel ch) throws Exception {
    					
    					ch.pipeline().addLast(new ObjectDecoder(1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
    					ch.pipeline().addLast(new ObjectEncoder());
    					
    					ch.pipeline().addLast(new StringDecoder());
    					ch.pipeline().addLast(new UserQueryClientHandler());
    				}
    			});
    			//发起异步链接操作
    			ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
    			
    			channelFuture.channel().closeFuture().sync();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			//关闭,释放线程资源
    			group.shutdownGracefully();
    		}
    	}	
    	@Test
    	public void nettyClient(){
    		
    		new NettyClient().connect(8989, "localhost");
    	}
    }</span>
  3. ServerHander 代码
    <span style="font-size:12px;">/**
     * 
     * <p>
     *  用户查询返回
     * </p>
     * 
     * @author 卓轩
     * @创建时间:2014年7月7日
     * @version: V1.0
     */
    public class UserRespServerHandler extends ChannelInboundHandlerAdapter {
    
    
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		
    		UserQuery userQuery = (UserQuery) msg;
    		
    		System.out.println("收到来自客户端的查询请求:"+ String.valueOf(userQuery));
    		
    		if(userQuery != null && userQuery.getUserId()!= 0){
    			UserDO userDO = getUserById(userQuery.getUserId());
    			ctx.writeAndFlush(userDO);
    		}
    	}
    
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    		
    		System.out.println("Server has Exception,"+ cause.getCause());
    	
    	}
    	
    	
    	private UserDO getUserById(int userId){
    		
    		if(userId % 2 == 0){
    			UserDO zhuoxuan = new UserDO();
    			zhuoxuan.setUserId(userId);
    			zhuoxuan.setSex(1);
    			zhuoxuan.setUname("卓轩");
    			zhuoxuan.setUnick("zhuoxuan");
    			zhuoxuan.setEmail("zhuoxuan@mogujie.com");
    			return zhuoxuan;
    		}else{
    			UserDO zhuoxuan = new UserDO();
    			zhuoxuan.setUserId(userId);
    			zhuoxuan.setSex(1);
    			zhuoxuan.setUname("张三");
    			zhuoxuan.setUnick("zhangsan");
    			zhuoxuan.setEmail("zhuoxuan@mogujie.com");
    			return zhuoxuan;
    		}	
    	}
    }</span><strong style="font-size: 14px;">
    </strong>

  4. ClientHander 代码

<span style="font-size:12px;">/**
 * 
 * <p>
 * 用户查询请求 Handler
 * </p>
 * 
 * @author 卓轩
 * @创建时间:2014年7月7日
 * @version: V1.0
 */
public class UserQueryClientHandler extends ChannelInboundHandlerAdapter {
	
	

	public UserQueryClientHandler() {
		
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		
		for (int i = 0; i < 100; i++) {
			UserQuery userQuery = new UserQuery();
			userQuery.setUserId(1001+i);
			ctx.write(userQuery);
		}
		ctx.flush();
		
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		
		String message = String.valueOf(msg);
		
		System.out.println("Netty-Client:Receive Message,"+ message);
	}
	
	

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		ctx.flush();
	}
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

		System.out.println("Client has Exception,"+ cause.getCause());
	}
}</span>