// 接收请求内容并打印
ByteBuf byteBuf = msg.content();
byte[] bytes = new byte[byteBuf.readableBytes()];
byteBuf.readBytes(bytes);
String requestStr = new String(bytes, "UTF-8");
System.out.println(requestStr);
DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,
Unpooled.wrappedBuffer("你才是猪!".getBytes()));
HttpHeaders heads = response.headers();
// 返���内容的MIME类型
heads.add(HttpHeaderNames.CONTENT_TYPE, contentType + "; charset=UTF-8");
// 响应体的长度
heads.add(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
// 表示是否需要持久连接
heads.add(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
// 响应给客户端
ctx.write(response);
}
/**
* 数据发送完毕,则关闭连接通道.
*/
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception
{
System.out.println("channelReadComplete");
super.channelReadComplete(ctx);
ctx.flush();
}
/**
* 发生异常
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
{
System.out.println("exceptionCaught");
if (null != cause)
cause.printStackTrace();
if (null != ctx)
ctx.close();
}
}
最后,让我们利用Netty4来发布Http协议服务接口,代码如下
package com.alanlee.netty2;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
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.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
/**
* 搭建HttpServer
*
* @author Alanlee
* @version 2018/01/11
*
*/
public class HttpServer
{
private final int port;
public HttpServer(int port)
{
this.port = port;
}
public static void main(String[] args) throws InterruptedException
{
new HttpServer(8081).start();
System.out.println("Start http server success!");
}
public void start() throws InterruptedException
{
// 初始化channel的辅助类
ServerBootstrap b = new ServerBootstrap();
NioEventLoopGroup group = new NioEventLoopGroup();
b.group(group).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>()
{
/**
* 初始化channel
*/
@Override
protected void initChannel(SocketChannel ch) throws Exception
{
System.out.println("initChannel ch:" + ch);
// 获取管道
ch.pipeline().addLast("decoder", new HttpRequestDecoder()) // 解码
.addLast("encoder", new HttpResponseEncoder()) // 编码
/* aggregator,消息聚合器(重要)。
Netty4中为什么能有FullHttpRequest这个东西,
就是因为有他,HttpObjectAggregator,如果没有他,
就不会有那个消息是FullHttpRequest的那段Channel,
同样也不会有FullHttpResponse,HttpObjectAggregator(512 * 1024)的参数含义是消息合并的数据大小,
如此代表聚合的消息内容长度不超过512kb。*/
.addLast("aggregator", new HttpObjectAggregator(512 * 1024))
.addLast("handler", new HttpHandler()); // 请求的业务类
}
}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE);
// 创建服务器端channel的辅助类,接收connection请求
b.bind(port).sync();
}
}
检验成果
我们可以通过运行Netty3以及Netty4对应的HttpServer中的main方法来启动我们的Http服务器模拟。
启动Netty3提供的Http协议服务器,结果如下:
启动成功之后,我们利用Postman工具来做个简单的测试,注意这里Netty3使用的是8080端口,结果如下:
控制台输出内容如下:
我们再来启动Netty4提供的Http协议服务器,结果如下:
启动成功之后,我们利用Postman工具来做个简单的测试,注意这里Netty4使用的是8081端口,结果如下:
控制台输出内容如下: