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