netty Demo 实例

netty写的代理服务器Demo

package com.jiepu.netty2;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;

/**
 * netty写的代理服务器Demo
 * http://www.oschina.net/code/snippet_573815_50151
 */
public class CommonServer {

	public static void main(String[] args) throws Exception {
		
		//http://localhost:9999/
		start(9999);
		
	}
	public static void start(int port) throws InterruptedException {

		EventLoopGroup bossGroup = new NioEventLoopGroup();
		NioEventLoopGroup workerGroup = new NioEventLoopGroup(2);

		workerGroup.setIoRatio(50);
		try {
			ServerBootstrap b = new ServerBootstrap();

			b.group(bossGroup, workerGroup)
					.channel(NioServerSocketChannel.class)
					.childHandler(new ChannelInitializer() {
						@Override
						public void initChannel(SocketChannel ch)
								throws Exception {
							

							System.out.println("server  start");
							ch.config().setAutoRead(true);
							ch.pipeline().addLast(new HttpRequestDecoder());
							ch.pipeline().addLast(new HttpResponseEncoder());
							ch.pipeline().addLast(new HttpServerHandler2());
						}
					}).option(ChannelOption.SO_BACKLOG, 128) // 流控
					.childOption(ChannelOption.SO_KEEPALIVE, true);
			ChannelFuture f = b.bind(port).sync();

			System.out.println("run");
			f.channel().closeFuture().sync();
		} finally {
			workerGroup.shutdownGracefully();
			bossGroup.shutdownGracefully();
		}

	}

}

package com.jiepu.netty2;

import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultHttpRequest;
import io.netty.handler.codec.http.DefaultLastHttpContent;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.handler.codec.http.HttpVersion;

import java.net.URI;

/**
 * 类HttpClientHandler2.java的实现描述:TODO 类实现描述
 * 
 * @author yp 2015年8月10日 上午9:15:46
 */
public class HttpClientHandler2 extends ChannelHandlerAdapter {

	String host;
	String uri;
	ChannelHandlerContext serverCtx;

	public HttpClientHandler2(String host, String uri,
			ChannelHandlerContext serverCtx) {
		this.host = host;
		this.uri = uri;
		this.serverCtx = serverCtx;
	}

	@Override
	public void channelActive(final ChannelHandlerContext ctx) throws Exception {
		URI uri = new URI(this.uri);
		DefaultHttpRequest req = new DefaultHttpRequest(HttpVersion.HTTP_1_1,
				HttpMethod.GET, uri.toASCIIString());
		req.headers().add("Host", this.host);
		ctx.writeAndFlush(req);
	}

	/*
	 * tb2.bdstatic.com/img/search_logo_7835b03.png (non-Javadoc)
	 * 
	 * @see io.netty.channel.ChannelHandlerAdapter#channelRead(io.netty.channel.
	 * ChannelHandlerContext, java.lang.Object)
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, final Object msg)
			throws Exception {
		if (msg instanceof HttpResponse) {
			serverCtx.writeAndFlush(msg);
		} else if (msg instanceof DefaultLastHttpContent) {
			// 最后的消息
			serverCtx.writeAndFlush(msg);
			ctx.channel().close();

		} else if (msg instanceof HttpContent) {
			serverCtx.writeAndFlush(msg);
		}
	}

}
package com.jiepu.netty2;

/*
 * Copyright 2015 yp All right reserved. This software is the
 * confidential and proprietary information of yp ("Confidential
 * Information"). You shall not disclose such Confidential Information and shall
 * use it only in accordance with the terms of the license agreement you entered
 * into with yp .
 */

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpRequestEncoder;
import io.netty.handler.codec.http.HttpResponseDecoder;
 
import java.net.InetAddress;

/**
 * 类HttpServerHandler2.java的实现描述:TODO 类实现描述
 * 
 * @author yp 2015年8月10日 上午9:17:17
 */
public class HttpServerHandler2 extends ChannelHandlerAdapter {
 
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
 
        if (msg instanceof HttpRequest) {
            HttpRequest request = (HttpRequest) msg;
            //System.out.println(request.toString());            
            if (request.getUri().contains("pic1")) {
                InetAddress iAddress = InetAddress.getByName("asearch.alicdn.com");
                String uri = "/bao/uploaded/i1/189050106579034484/TB28ir7dpXXXXbcXXXXXXXXXXXX_!!17468905-0-saturn_solar.jpg_200x200.jpg_.webp";
                Bootstrap b = createBootStrap(ctx, "asearch.alicdn.com", uri);
                b.connect(iAddress, 80);
            } else {
                InetAddress iAddress = InetAddress.getByName("i1.itc.cn");
                String uri = "/20150806/31e9_f52bb95f_f509_7bc6_5def_c0e48e908048_1.jpg";
                Bootstrap b = createBootStrap(ctx, "i1.itc.cn", uri);
                b.connect(iAddress, 80);
            }
        } else if (msg instanceof HttpContent) {
            System.out.println("http content");
        }
    }
 
    /**
     * @param ctx
     * @param uri
     * @return
     */
    private Bootstrap createBootStrap(final ChannelHandlerContext ctx, final String host, final String uri) {
        Bootstrap b = new Bootstrap();
        b.group(ctx.channel().eventLoop());
        b.channel(NioSocketChannel.class);
        b.option(ChannelOption.SO_KEEPALIVE, true);
        b.option(ChannelOption.TCP_NODELAY, true);
        b.handler(new ChannelInitializer() {
            @Override
            public void initChannel(SocketChannel ch) throws Exception {
                ch.config().setAllocator(new PooledByteBufAllocator());
                ch.pipeline().addLast(new HttpRequestEncoder());
                ch.pipeline().addLast(new HttpResponseDecoder());
                ch.pipeline().addLast(new HttpClientHandler2(host, uri, ctx));
            }
        });
        return b;
    }
}

	4.0.0

	com.jiepu
	netty2
	0.0.1-SNAPSHOT
	jar

	netty2
	http://maven.apache.org

	
		UTF-8
	

	
		
			junit
			junit
			4.10
			test
		
		
			io.netty
			netty-all
			5.0.0.Alpha1
		
	
	
		
			
				org.apache.maven.plugins
				maven-compiler-plugin
				
					1.7
					1.7
				
			

		
	





你可能感兴趣的:(java)