使用Netty3或Netty4发布Http协议服务(3)

// 接收请求内容并打印
        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协议服务器,结果如下:

使用Netty3或Netty4发布Http协议服务

启动成功之后,我们利用Postman工具来做个简单的测试,注意这里Netty3使用的是8080端口,结果如下:

使用Netty3或Netty4发布Http协议服务

控制台输出内容如下:

使用Netty3或Netty4发布Http协议服务

我们再来启动Netty4提供的Http协议服务器,结果如下:

使用Netty3或Netty4发布Http协议服务

启动成功之后,我们利用Postman工具来做个简单的测试,注意这里Netty4使用的是8081端口,结果如下:

使用Netty3或Netty4发布Http协议服务

控制台输出内容如下:

使用Netty3或Netty4发布Http协议服务

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/986c827f7d9034254685abb63c9f958c.html