2011-01-19 4 views
1

Поддерживает ли com.sun.net.httpserver.HttpServer одноранговую конвейерную обработку? Кажется, что он обрабатывает несколько клиентов параллельно, но запросы одного соединения выполняются последовательно.Поддерживает ли com.sun.net.httpserver.HttpServer конвейеринг?

Насколько это точно, и если да, то есть ли способ обойти это?

ответ

0

Предполагается, что HTTP-серверы, соответствующие HTTP 1.1, будут поддерживать конвейерную обработку. Обратите внимание, что конвейерная обработка также должна поддерживаться клиентом.
Согласно httpserver

В API обеспечивает частичную реализацию RFC 2616 (HTTP 1.1) и RFC 2818 (HTTP через TLS).

Похоже, что com.sun.net.httpserver.HttpServer не поддерживает полностью HTTP1.1.
HttpURLConnection не поддерживает конвейерную обработку, поэтому я склоняюсь к мысли, что com.sun.net.httpserver.HttpServer не поддерживает конвейерную обработку.
Вы говорите, что сделали несколько тестов. Как вы это протестировали?

Update:
Из записки, кажется, что конвейерная поддерживается.
Если, как вы говорите, вы отправляете запросы конвейерно, ответы должны возвращаться в соответствии с приходом запросов (не имеет значения времени, которое требуется для завершения каждого запроса, то есть некоторые быстрее других).

+0

Я протестировал его, создав сервер, который обрабатывает два запроса: тот, который спит, и тот, который этого не делает, и конвейерный клиент. Создание двух соединений не блокирует друг друга (выполняется одновременно сервером), но медленный, сопровождаемый быстрым запросом на одно и то же соединение, приводит к быстрому ожиданию медленного завершения. В документации также добавляется: «Любая HTTP-функция, не предоставляемая этим API, может быть реализована кодом приложения с помощью API». Если у вас есть какие-то идеи о том, как лучше всего подойти к этому, я был бы благодарен за их слушание. – Brian

+0

@Brian: Если я правильно понимаю: вы используете конвейерный клиент (ваша реализация?), И вы отправляете 2 запроса по одному и тому же HTTP-соединению. Один медленный, за которым следует один быстрый. Я не уверен, что вы имеете в виду здесь, но на конвейерная обработка, если клиент отправит Req1, Req2 на сервер, тогда ожидается, что сервер отправит Response for Req1, а затем Response for Req2. То есть сервер ДОЛЖЕН отправлять ответы на запросы в том же порядке, что и полученные запросы. Поэтому из вашего описания кажется, что это происходит в вашем случае, поскольку быстрый запрос был отправлен после медленного. – Cratylus

+0

У меня есть трассировочные точки в обоих запросах, чтобы отметить их время начала и окончания. То, что я всегда вижу, - «СТАРТ А, КОНЕЦ А, СТАРТ Б, КОНЕЦ В». Конечно, я бы хотел увидеть «СТАРТ А, СТАРТ Б, КОНЕЦ А; КОНЕЦ В» - и это происходит, если два разных соединения выдают А и В, но не для того же. – Brian

0

HTTP-конвейерная обработка означает что-то действительно простое: клиент может написать следующий запрос к соединению, не прочитав предыдущий ответ.

Это действительно сложно для любого HTTP-сервера не поддерживать конвейерную обработку. Он должен смотреть в будущее, и если он найдет байты, доступные за пределами текущего запроса, ему нужно отменить ... но это смешно, и никто этого не делает.

Это не имеет никакого отношения к тому, как запросы обрабатываются сервером - поочередно или параллельно. Выполнение этого параллельно, конечно, сложнее, и есть некоторые вопросы, которые необходимо решить.

+0

Вопрос был больше в контексте самого класса HttpServer. Зарегистрированный HttpHandler будет вызываться последовательно для двух конвейерных запросов, где для каждого запроса предоставляется объект HttpExchange. Похоже, что два HttpExchanges могут быть выдающимися для одного соединения, даже если сервер тщательно реагирует в правильном порядке. – Brian

+0

@Brian per HTTP spec, сервер по-прежнему поддерживает конвейерную обработку, хотя внутренние запросы обрабатываются последовательно. – irreputable

 Смежные вопросы

  • Нет связанных вопросов^_^