Принуждение встроенного 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

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