Предполагается, что 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:
Из записки, кажется, что конвейерная поддерживается.
Если, как вы говорите, вы отправляете запросы конвейерно, ответы должны возвращаться в соответствии с приходом запросов (не имеет значения времени, которое требуется для завершения каждого запроса, то есть некоторые быстрее других).
Я протестировал его, создав сервер, который обрабатывает два запроса: тот, который спит, и тот, который этого не делает, и конвейерный клиент. Создание двух соединений не блокирует друг друга (выполняется одновременно сервером), но медленный, сопровождаемый быстрым запросом на одно и то же соединение, приводит к быстрому ожиданию медленного завершения. В документации также добавляется: «Любая HTTP-функция, не предоставляемая этим API, может быть реализована кодом приложения с помощью API». Если у вас есть какие-то идеи о том, как лучше всего подойти к этому, я был бы благодарен за их слушание. – Brian
@Brian: Если я правильно понимаю: вы используете конвейерный клиент (ваша реализация?), И вы отправляете 2 запроса по одному и тому же HTTP-соединению. Один медленный, за которым следует один быстрый. Я не уверен, что вы имеете в виду здесь, но на конвейерная обработка, если клиент отправит Req1, Req2 на сервер, тогда ожидается, что сервер отправит Response for Req1, а затем Response for Req2. То есть сервер ДОЛЖЕН отправлять ответы на запросы в том же порядке, что и полученные запросы. Поэтому из вашего описания кажется, что это происходит в вашем случае, поскольку быстрый запрос был отправлен после медленного. – Cratylus
У меня есть трассировочные точки в обоих запросах, чтобы отметить их время начала и окончания. То, что я всегда вижу, - «СТАРТ А, КОНЕЦ А, СТАРТ Б, КОНЕЦ В». Конечно, я бы хотел увидеть «СТАРТ А, СТАРТ Б, КОНЕЦ А; КОНЕЦ В» - и это происходит, если два разных соединения выдают А и В, но не для того же. – Brian