java - 无法获取 Stream 1:在 Java 11 HTTP/2 客户端中读取时达到 EOF
问题描述
我目前正在学习 Java 11 中的 HTTP/2 客户端(java.net.http
模块)
我的目的是POST
JSON
使用 Java 11 HTTP/2 客户端将数据发送到本地服务器,但我发生了IOException
一些EOFException
.
例外
Exception in thread "main" java.io.IOException: Can't get stream 1: java.io.EOFException: EOF reached while reading
at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:565)
at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)
at study/study.Http2ClientSample4.main(Http2ClientSample4.java:37)
Caused by: java.io.IOException: Can't get stream 1: java.io.EOFException: EOF reached while reading
at java.net.http/jdk.internal.net.http.Exchange.lambda$checkForUpgradeAsync$12(Exchange.java:486)
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
at java.net.http/jdk.internal.net.http.Exchange.lambda$checkForUpgradeAsync$13(Exchange.java:474)
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
at java.net.http/jdk.internal.net.http.Exchange.checkForUpgradeAsync(Exchange.java:467)
at java.net.http/jdk.internal.net.http.Exchange.lambda$wrapForUpgrade$10(Exchange.java:432)
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
at java.net.http/jdk.internal.net.http.Exchange.wrapForUpgrade(Exchange.java:432)
at java.net.http/jdk.internal.net.http.Exchange.sendRequestBody(Exchange.java:399)
at java.net.http/jdk.internal.net.http.Exchange.checkFor407(Exchange.java:354)
at java.net.http/jdk.internal.net.http.Exchange.lambda$responseAsyncImpl0$7(Exchange.java:423)
at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:930)
at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:907)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1705)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.io.EOFException: EOF reached while reading
at java.net.http/jdk.internal.net.http.Http2Connection$Http2TubeSubscriber.onComplete(Http2Connection.java:1336)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:632)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:833)
at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:175)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:763)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:941)
at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:245)
at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:957)
at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:912)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:912)
我的代码
Path testPath = Paths.get( System.getProperty( "user.dir" ), "jsonSample.txt" );
byte[] testb = Files.readAllBytes( testPath );
System.out.println( new String( testb ) );
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri( URI.create( "http://localhost:8080" ) )
.header("Content-Type", "application/json")
.header( "Accept", "application/json" )
// .header( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" )
.POST( HttpRequest.BodyPublishers.ofFile( testPath ) )
.build();
HttpResponse<?> response = client.send( request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
我究竟做错了什么?
解决方案
这可能是因为您的服务器不支持 HTTP/2。尝试添加version(HttpClient.Version.HTTP_1_1)
到 HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri( URI.create( "http://localhost:8080" ) )
.header("Content-Type", "application/json")
.header( "Accept", "application/json" )
.version(HttpClient.Version.HTTP_1_1)
.POST( HttpRequest.BodyPublishers.ofFile( testPath ) )
.build();
推荐阅读
- java - JNA NativeKeyEvent 到 char
- r - 无法在 R 中使用 createDataPartition 创建完全相同的数据分区 - 分别获得 1396 和 1398 个观测值,但需要 1397
- hibernate - 复杂参考情况行为中的休眠逐出级联
- python - ValueError:输入数组应具有与目标数组相同数量的样本。找到 1 个输入样本和 416 个目标样本
- javascript - 通过javascript读取表格单元格
- c# - 有什么方法可以检查 C# dynamics 365 中的探查器模式?
- android - React-Native 未构建
- angular - 如何检查当前哪个组件具有焦点
- c# - cosmos db 中的异步查询
- flutter - 当应用程序在后台时使用 uni_links