代码参照netty官网例子修改而成,保留最核心的部分
package com.rock.netty.http.t;import java.net.URI;import java.nio.charset.Charset;import io.netty.bootstrap.Bootstrap;import io.netty.channel.Channel;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;import io.netty.handler.codec.http.DefaultFullHttpRequest;import io.netty.handler.codec.http.FullHttpRequest;import io.netty.handler.codec.http.FullHttpResponse;import io.netty.handler.codec.http.HttpClientCodec;import io.netty.handler.codec.http.HttpContentDecompressor;import io.netty.handler.codec.http.HttpHeaderNames;import io.netty.handler.codec.http.HttpHeaderValues;import io.netty.handler.codec.http.HttpMethod;import io.netty.handler.codec.http.HttpObjectAggregator;import io.netty.handler.codec.http.HttpVersion;public class NettyHttpClientTest2 { public static void main(String[] args) throws Exception { sendRequest("http://www.baidu.com/"); } private static void sendRequest(String url)throws Exception{ URI uri = new URI(url); String host = uri.getHost(); int port = 80; // Configure the client. EventLoopGroup group = new NioEventLoopGroup(); Bootstrap b = new Bootstrap(); b.group(group).channel(NioSocketChannel.class).handler(new HttpClientInitializer()); // Make the connection attempt. Channel ch = b.connect(host, port).sync().channel(); // Prepare the HTTP request. FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri.getRawPath()); request.headers().set(HttpHeaderNames.HOST, host); request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE); request.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); // Send the HTTP request. ch.writeAndFlush(request); // Wait for the server to close the connection. ch.closeFuture().sync(); // Shut down executor threads to exit. group.shutdownGracefully(); }}class HttpClientMsgHandler extends SimpleChannelInboundHandler{ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } @Override protected void channelRead0(ChannelHandlerContext ctx, FullHttpResponse response) throws Exception { if (!response.headers().isEmpty()) { for (CharSequence name : response.headers().names()) { for (CharSequence value : response.headers().getAll(name)) { System.err.println("HEADER: " + name + " = " + value); } } System.err.println(); } System.err.println(response.content().toString(Charset.forName("utf-8"))); }}class HttpClientInitializer extends ChannelInitializer { @Override public void initChannel(SocketChannel ch) { ChannelPipeline p = ch.pipeline(); p.addLast(new HttpClientCodec()); // Remove the following line if you don't want automatic content // decompression. p.addLast(new HttpContentDecompressor());//这里要添加解压,不然打印时会乱码 // Uncomment the following line if you don't want to handle // HttpContents. // p.addLast(new HttpObjectAggregator(1048576)); p.addLast(new HttpObjectAggregator(123433));//添加HttpObjectAggregator, HttpClientMsgHandler才会收到FullHttpResponse p.addLast(new HttpClientMsgHandler()); }}