【问题标题】:Does com.sun.net.httpserver.HttpServer support pipelining?com.sun.net.httpserver.HttpServer 是否支持流水线?
【发布时间】:2011-06-12 01:18:03
【问题描述】:

com.sun.net.httpserver.HttpServer 是否支持单连接流水线?它似乎是并行处理多个客户端,但单个连接的请求是串行执行的。

这是否准确,如果是,有没有办法解决这个问题?

【问题讨论】:

    标签: java http pipelining com.sun.net.httpserver


    【解决方案1】:

    符合 HTTP 1.1 的 HTTP 服务器应该支持流水线。请注意,客户端也应该支持流水线。
    根据httpserver

    API 提供了部分 RFC 2616 (HTTP 1.1) 的实现 和 RFC 2818(基于 TLS 的 HTTP)。

    这似乎暗示com.sun.net.httpserver.HttpServer 不完全支持HTTP1.1。
    HttpURLConnection 不支持流水线,所以我倾向于认为com.sun.net.httpserver.HttpServer 也不支持流水线。
    你说你做了一些测试。你是如何测试这个的?

    更新
    从注释看来,流水线是受支持的。
    如果如您所说,您通过管道发送请求,则响应应根据请求的到达返回(与完成每个请求所需的时间无关,即有些比其他请求更快)。

    【讨论】:

    • 我通过创建一个服务器来测试它,该服务器处理两个请求,一个休眠,一个不休眠,一个流水线客户端。创建两个连接不会互相阻塞(由服务器同时执行),但是在同一连接上的快速请求之后的慢速请求会导致快速等待慢速完成。该文档还补充说,“任何此 API 未提供的 HTTP 功能都可以通过使用该 API 的应用程序代码来实现。”如果您对如何最好地解决此问题有任何想法,我将不胜感激。
    • @Brian:如果我理解正确:您使用的是流水线客户端(您的实现?)并且您通过同一个 HTTP 连接发送 2 个请求。一个慢,一个快。我不确定您在这里的意思是,但是在流水线中,如果客户端将 Req1,Req2 发送到服务器,则服务器应发送 Req1 的响应,然后是 Req2 的响应。 IE。服务器必须按照收到请求的顺序发送对请求的响应。因此,根据您的描述,您的情况似乎确实发生了这种情况,因为快速请求是在慢速之后发送的。
    • 我在两个请求中都有跟踪点来标记它们的开始时间和结束时间。我经常看到的是“START A; END A; START B; END B”。当然,我想看到的是“START A; START B; END A; END B”——如果两个不同的连接发出 A 和 B,就会发生这种情况,但不是相同的。
    • @Brian:你不是说你使用的是流水线客户端吗?你不是通过流水线发送请求吗?你能提供更多关于客户端实现的细节吗?因为到目前为止你的笔记似乎自相矛盾。
    【解决方案2】:

    HTTP 流水线意味着非常简单的事情:客户端可以将下一个请求写入连接,而无需读取上一个响应。

    任何http服务器都很难不支持流水线。它必须向前看,如果它发现超出当前请求的可用字节,它需要中止......但这很荒谬,没有人这样做。

    这与服务器如何处理请求无关 - 串行或并行。并行做当然更难,有一些问题是必须要解决的。

    【讨论】:

    • 问题更多是在 HttpServer 类本身的上下文中。注册的 HttpHandler 将为两个流水线请求串行调用,其中,对于每个请求,都会给出一个 HttpExchange 对象。即使服务器小心地以正确的顺序响应,似乎也不会出现两个 HttpExchanges 对于单个连接未完成的情况。
    • @Brian 根据 HTTP 规范,服务器仍然支持流水线,即使内部请求是串行处理的。
    猜你喜欢
    • 2011-12-06
    • 2012-10-20
    • 1970-01-01
    • 2019-07-19
    • 2018-11-25
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多