Я экспериментировал с материалом HttpClient в инкубаторе Java 9/10, и у меня есть следующий тривиальный код (фактически украденный с домашней страницы проекта!):
URI uri = URI.create("http://192.168.1.102:8080/");
HttpRequest getRequest = HttpRequest.newBuilder()
.uri(uri)
.GET()
.build();
HttpResponse<String> response = client.send(getRequest,
HttpResponse.BodyHandler.asString());
System.out.println("response to get: " + response.body());
Я считаю, что это работаетхорошо, если он указывает на URL-адрес, который не является локальным, но завершается неудачно, если я запрашиваю локальный хост (по имени «локальный хост», по 172.0.0.1 или по фактическому IP-адресу локального хоста).Ошибка очень странная, и во всей трассировке стека не упоминается ни один мой код.
WARNING: Using incubator modules: jdk.incubator.httpclient
Exception in thread "main" java.io.EOFException: EOF reached while reading
at jdk.incubator.httpclient/jdk.incubator.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:507)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:551)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:728)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowTask.run(SocketTube.java:171)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:675)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:829)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:243)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:769)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:731)
Локально работает сервер, и я могу просто подключиться к нему, используя простой запрос из Интернета.браузер.
Есть мысли?
[EDIT] Я обнаружил, я полагаю, список рассылки для этого проекта.Он «запутан» (что полностью меня одурачило!), Но показан как: net dash dev at openjdk dot java dot net
Я тоже напишу там и посмотрю, есть ли у них какие-либо данные.
[РЕДАКТИРОВАТЬ 2] Я почти уверен, что этоне имеет ничего общего с localhost (согласно оригинальному названию), но это что-то в согласовании протокола с node.js / express (сервер, который я использую, потому что с ним легко экспериментировать).Иногда узел (например, с последней строкой текста, которая не заканчивается LF), похоже, сообщает о неправильной длине содержимого, но это не проблема, поскольку сбой все еще происходит с правильной длиной.Я думаю, что это возможно ошибка в попытке обновить соединение до HTTP / 2.0, но пока не знаю ...
[РЕДАКТИРОВАТЬ 3] После того, как я потратил слишком много времени на эксперименты, я довольноубедитесь, что есть что-то в том, как node.js 8.11.1 (и экспресс 4.13.4 и body-parser 1.15.1) обрабатывает запрос на обновление до HTTP 2.0, который вызывает проблему.Но я понятия не имею, что.Я сдаюсь и продолжу процесс обучения для httpClient, используя другой сервер.