netty - 如何使用 "HttpRequest"、 "FullHttpRequest"、 "HttpMessage"、 "FullHttpMessage"和 "LastHttpContent"?

标签 netty

我正在尝试使用 netty编写一些 HTTP 应用程序。但我对这么多类似的类型感到困惑:

  • HttpRequest
  • FullHttpRequest
  • HttpMessage
  • FullHttpMessage
  • HttpResponse
  • FullHttpResponse
  • LastHttpContent

  • 我想我对netty's design philosophy缺乏了解这背后。

    有人能解释一下吗?

    最佳答案

    当 HTTP 消息被 HttpObjectDecoder 解码时,解码器产生以下对象:

  • HttpRequestHttpResponse提供从初始行及其后续标题解码的属性。
  • 一系列HttpContent .最后 HttpContentLastHttpContent .

  • 典型的处理程序代码如下所示:
    if (msg instanceof HttpRequest) {
        ...
    }
    if (msg instanceof HttpContent) {
        ...
        if (msg instanceof LastHttpContent) {
            ...
        }
    }
    

    请注意 if块不是相互排斥的,因此当满足上述 3 个条件之一时,处理程序不会返回。看看HttpSnoopServerHandler举个具体的例子。

    现在,让我们看看FullHttpRequest .它实现了 HttpRequest , HttpContent , 和 LastHttpContent .当我们插入 HttpObjectAggregator 时,编写良好的处理程序应该可以正常工作。无需更改任何代码即可进入管道。

    所以,这个看起来很奇怪的类层次结构的目的是让用户可以选择使用 HttpObjectAggregator或不。

    但是,我同意这并不直观。我们将在 Netty 5 中以这样一种方式修复这个问题,即解码器只生成一个 HTTP 消息对象,然后将其内容流式传输到它。

    关于netty - 如何使用 "HttpRequest"、 "FullHttpRequest"、 "HttpMessage"、 "FullHttpMessage"和 "LastHttpContent"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213793/

    相关文章:

    java - 为什么这个 boolean 比较不能正常工作?

    java - 对象解码期间发生 StreamCorruptedException

    java - 扩展 ChannelHandlerAdapter,但不重写或实现 ChannelHandlerAdapter 中的方法

    java - Netty Camel 示例

    Netty 4 - 直接将ByteBuf写入 channel ,绕过管道

    java - Netty - sendAsync()组空指针异常

    ssl - JBoss 网络 : Support for SNI (Server Name Indication)

    网络 4 : NioEventLoop rebuild selector too often

    java - 如何使用一个Bootstrap连接Netty中的多个服务器

    java - Netty IO发送消息给客户端