几十行代码基于Netty搭建一个 HTTP Server( 三 )
HttpContent
看作是这一块一块的数据 。
LastHttpContent
: 标识 HTTP 请求结束 , 同时包含 HttpHeaders
对象 。 FullHttpRequest
和 FullHttpResponse
: HttpMessage
和 HttpContent
聚合后得到的对象 。 文章插图
HTTP 消息聚合器
HttpObjectAggregator
是 Netty 提供的 HTTP 消息聚合器 , 通过它可以把 HttpMessage
和 HttpContent
聚合成一个 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.netty netty-all4.1.42.Final org.slf4j slf4j-api1.7.25 org.slf4j slf4j-simple1.7.25 org.projectlombok lombok1.18.8 providedcommons-codec commons-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();}}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 华硕基于WRX80的主板现身 为AMD Ryzen Threadripper Pro打造
- 锐龙5000微代码更新:超频更稳、X570无需风扇
- 微软新版电子邮件客户端截图曝光:基于网页端Outlook
- 小米MIUI代码泄露新机:或edmi K40
- 曝光 | 小鹏或春节前推送NGP更新,基于高精地图可自动变道
- 用Python制作图片验证码,这三行代码完事儿
- 基于Spring+Angular9+MySQL开发平台
- 微软称SolarWinds黑客攻击波及公司内部的源代码存储库
- 整合零代码+AI+云原生技术,「速优云」布局智慧教培和智慧社区
- 终于可以自定义喇叭声:你的特斯拉可以“放屁”吓唬人了