【问题标题】:Use HttpCore + HttpNIO from Apache for HTTP Pipelining on Android?在 Android 上使用 Apache 的 HttpCore + HttpNIO 进行 HTTP 管道化?
【发布时间】:2011-11-20 17:53:53
【问题描述】:

Android 使用 Apache 的 HTTP 组件库来执行 HTTP 请求并公开一个不支持异步请求或流水线的 API。我们正在编写一个可以从流水线中受益的应用程序,因此我们使用Hotpotato 来执行这些请求。为了减小 APK 的大小(Hotpotato 和 Netty 使 APK 大小增加了约 2-4MB),我们希望在 HttpCore 和 HttpNIO 之上实现我们自己的。

Apache NIO extensions docs 对流水线有一个模糊的引用,提到“非阻塞 HTTP 连接 [是] 完全支持流水线的”,并且 HttpClient 代码上的 a bug 提到了流水线支持,但没有提到如何实现它。

如何使用 Apache 的 HTTP 组件在 Android 现有的 Apache HTTP 组件库之上实现对 HTTP 管道和持久连接的支持?

【问题讨论】:

    标签: android httpclient pipelining


    【解决方案1】:

    您很可能不会喜欢这个答案,但就这样吧。缺乏对 HTTP 流水线的支持的原因是 HTTP 流水线在非常有限的用例之外根本没有用处。 HTTP 流水线仅适用于(或由 HTTP 规范推荐)非幂等 HTTP 方法。这有效地排除了 POST 请求的流水线。对于需要使用 GET 请求检索大量 static 文件的浏览器,流水线可能稍微有用,同时仅限于与同一主机的 两个 同时 HTTP 连接。在这种情况下,HTTP 流水线可能会产生微小的性能改进。同时,我认为使用中等大小的持久连接池(不超过五个)的 HTTP 代理将优于流水线 HTTP 代理。 HTTP 管道的额外复杂性根本不值得麻烦,这就是为什么没有迫切需要为 HttpClient 和 HttpCore 添加对 HTTP 管道的开箱即用支持的原因。

    话说回来,HttpCore NIO 的所有非阻塞 HTTP 连接都是完全异步的,并且始终以全双工模式运行。 HttpCore 对可以写入多少请求或一次可以接收多少响应没有任何限制。协议处理程序负责将 HTTP 请求和响应关联到逻辑相关的消息交换序列中。标准 HTTP 协议处理程序不使用管道传输 HTTP 消息,以便能够支持 POST 请求的预期继续握手(预期验证和管道传输几乎是相互排斥的)。但是,没有什么可以阻止您构建自定义 NHttpClientHandler 类并使其成为管道请求。您可以从获取 HttpAsyncClientProtocolHandler [1] 的源代码开始,去掉 expect-continue 握手代码并添加传入和传出 HTTP 消息的队列。

    希望对你有帮助

    [1]http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientProtocolHandler.java

    【讨论】:

    • 感谢您的回复,但我的用例实际上会受益于流水线(通过高延迟手机连接的数百个小请求/响应)。我将看一下您提供的协议处理程序示例,但这并不是很多...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多