Принуждение встроенного HTTP-клиента Java к повторному использованию соединенияJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Принуждение встроенного HTTP-клиента Java к повторному использованию соединения

Сообщение Anonymous »

Я реализую свой собственный HTTP-сервер на Java, используя ServerSocket. Я хочу начать реализацию конвейерной обработки, поэтому я написал тест, который, как я ожидаю, провалится первым.

Код: Выделить всё

void sendMultipleRequestsOnSameConnection() throws URISyntaxException, InterruptedException, ExecutionException {
HttpRequest httpRequest = HttpRequest.newBuilder()
.POST(BodyPublishers.ofString("LOREM"))
.uri(new URI("http://127.0.0.1/wait2"))
.version(Version.HTTP_1_1)
.build();

HttpRequest httpRequest2 = HttpRequest.newBuilder()
.POST(BodyPublishers.ofString("LOREM"))
.uri(new URI("http://127.0.0.1/wait"))
.version(Version.HTTP_1_1)
.build();

CompletableFuture future1 = httpClient.sendAsync(httpRequest, BodyHandlers.ofString());
Thread.sleep(500);
CompletableFuture future2 = httpClient.sendAsync(httpRequest2, BodyHandlers.ofString());
Мой сервер регистрируется каждый раз, когда принимает новое соединение. После запуска этого теста я заметил, что сервер принимает 2 соединения. Я ожидал только 1 соединения, поскольку у меня есть другой тест, который делает что-то подобное и открывает только 1 соединение с сервером.
Этот тест работает должным образом:

Код: Выделить всё

    @Test
void sendMultipleRequestsOnSameConnection() throws URISyntaxException, IOException, InterruptedException {
HttpRequest httpRequest = HttpRequest.newBuilder()
.POST(BodyPublishers.ofString("LOREM"))
.uri(new URI("http://127.0.0.1/"))
.version(Version.HTTP_1_1)
.build();

String responseBody1 = httpClient.send(httpRequest, BodyHandlers.ofString()).body();
String responseBody2 = httpClient.send(httpRequest, BodyHandlers.ofString()).body();

Assertions.assertEquals("HELLO WORLD", responseBody1);
Assertions.assertEquals("HELLO WORLD", responseBody2);
}
Есть идеи, почему это происходит? Есть ли способ заставить HTTP-клиент повторно использовать одно и то же соединение из первого запроса? Если нет, то существует ли какой-либо внешний HTTP-клиент Java, который позволяет это, или мне нужно будет использовать Socket напрямую, чтобы обеспечить открытие только 1 соединения?
это ссылка на репозиторий: https: //github.com/dev-rifaii/http-from-scratch/tree/pipelining

Подробнее здесь: https://stackoverflow.com/questions/789 ... connection
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»