几十行代码基于Netty搭建一个 HTTP Server( 三 )

HttpContent 看作是这一块一块的数据 。

  • LastHttpContent : 标识 HTTP 请求结束 , 同时包含 HttpHeaders 对象 。
  • FullHttpRequestFullHttpResponseHttpMessageHttpContent 聚合后得到的对象 。

  • 几十行代码基于Netty搭建一个 HTTP Server文章插图
    HTTP 消息聚合器HttpObjectAggregator 是 Netty 提供的 HTTP 消息聚合器 , 通过它可以把 HttpMessageHttpContent 聚合成一个 FullHttpRequest 或者 FullHttpResponse(取决于是处理请求还是响应) , 方便我们使用 。
    另外 , 消息体比较大的话 , 可能还会分成好几个消息体来处理 , HttpObjectAggregator 可以将这些消息聚合成一个完整的 , 方便我们处理 。
    使用方法:将 HttpObjectAggregator 添加到 ChannelPipeline 中 , 如果是用于处理 HTTP Request 就将其放在 HttpResponseEncoder 之后 , 反之 , 如果用于处理 HTTP Response 就将其放在 HttpResponseDecoder 之后 。
    因为 , HTTP Server 端用于接收 HTTP Request , 对应的使用方式如下 。
    ChannelPipeline p = ...; p.addLast("decoder", new HttpRequestDecoder()).addLast("encoder", new HttpResponseEncoder()).addLast("aggregator", new HttpObjectAggregator(512 * 1024)).addLast("handler", new HttpServerHandler());基于 Netty 实现一个 HTTP Server通过 Netty , 我们可以很方便地使用少量代码构建一个可以正确处理 GET 请求和 POST 请求的轻量级 HTTP Server 。
    源代码地址:/tree/master/example/http-server。
    添加所需依赖到 pom.xml第一步 , 我们需要将实现 HTTP Server 所必需的第三方依赖的坐标添加到 pom.xml中 。
    io.nettynetty-all4.1.42.Finalorg.slf4jslf4j-api1.7.25org.slf4jslf4j-simple1.7.25org.projectlomboklombok1.18.8providedcommons-codeccommons-codec1.14创建服务端@Slf4jpublic class HttpServer {private static final int PORT = 8080;public void start() {EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)// TCP默认开启了 Nagle 算法 , 该算法的作用是尽可能的发送大数据快 , 减少网络传输 。 TCP_NODELAY 参数的作用就是控制是否启用 Nagle 算法 。.childOption(ChannelOption.TCP_NODELAY, true)// 是否开启 TCP 底层心跳机制.childOption(ChannelOption.SO_KEEPALIVE, true)//表示系统用于临时存放已完成三次握手的请求的队列的最大长度,如果连接建立频繁 , 服务器处理创建新连接较慢 , 可以适当调大这个参数.option(ChannelOption.SO_BACKLOG, 128).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChannelInitializer() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast("decoder", new HttpRequestDecoder()).addLast("encoder", new HttpResponseEncoder()).addLast("aggregator", new HttpObjectAggregator(512 * 1024)).addLast("handler", new HttpServerHandler());}});Channel ch = b.bind(PORT).sync().channel();log.info("Netty Http Server started on port {}.", PORT);ch.closeFuture().sync();} catch (InterruptedException e) {log.error("occur exception when start server:", e);} finally {log.error("shutdown bossGroup and workerGroup");bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}}


    推荐阅读