Java.io.IOException:Connection上意外终止流的结束?

14

似乎调用我们内部Web服务时出现以下错误:

java.io.IOException: unexpected end of stream on Connection{webservicessandbox.xxx.com:443, proxy=DIRECT@ hostAddress=174.143.185.13 cipherSuite=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA protocol=http/1.1} (recycle count=0)

从我在其他地方看到的情况来看,这似乎是一个服务器问题,但是当在浏览器或IOS中调用WS时,我们并没有看到这个问题。 我已经尝试了OkHTTP和手动HTTPUrlConnection实现,但似乎没有任何区别。 有人有什么想法吗?

OKHttp:
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .addHeader("Authorization", "Bearer " + apiToken)
                    .addHeader("content-type", "application/json")
                    .url(uri)
                    .build();
HTTPURLConnection:
            URL myURL = new URL(uri);
            HttpsURLConnection myConnection = (HttpsURLConnection) myURL.openConnection();
            myConnection.setConnectTimeout(TIMEOUT_MILLISEC);
            myConnection.setDoOutput(false);
            myConnection.setRequestMethod("GET");
            myConnection.setRequestProperty("Authorization", "Bearer " + apiToken);
            myConnection.setRequestProperty("content-type", "application/json");
            int respCode = myConnection.getResponseCode();

1
你是否使用了某种代理? - Thalis Vilela
远程服务器是否需要双向 SSL(请求客户端证书)? - Dzmitry Prakapenka
据我所知,这可能只是适用于我的Android仿真的问题。当我从仿真切换到物理设备时,似乎不再出现此错误。我仍然不明白为什么以前我能够正常使用模拟器,现在却无法使用。可能是模拟器在某个时候进行了更新导致的问题? - Benjamin S
3个回答

12

请尝试以下潜在解决方案(据我所见):

1- 尝试使用以下代码:retryOnConnectionFailure(true)

OkHttpClient client = new OkHttpClient.Builder()
    .retryOnConnectionFailure(true)
    .build();

2- 尝试添加:request.addHeader("Connection","close") (在大多数情况下,这是解决问题的方法,参考Kartik的答案。)

Request request = new Request.Builder()
                    .addHeader("Authorization", "Bearer " + apiToken)
                    .addHeader("content-type", "application/json")
                    .addHeader("Connection","close")
                    .url(uri)
                    .build();

3- 请将服务器响应时间增加(尽可能设置得高一些),然后重试。

另请参见: OkHTTP Websocket: Unexpected end of steam on Connection


2

客户端和服务器一旦完成任务就需要关闭连接。

在您的OkHttp请求构建器中,添加以下代码:.header("Connection", "close")

还要检查浏览器检查器的网络选项卡,以查看浏览器正在发送哪些标头。在您的代码中匹配这些标头,它应该可以正常工作。


0
这个错误 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 与服务器有关。可能的原因是服务器已关闭。

感谢回复,但不,我能够使用其他设备持续调用服务。 - Benjamin S
这是一个设备特定的规格吗? - aanshu
这不是一个错误,而是一个TLS密码套件。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接