java.io.IOException:android 连接上的流意外结束

Posted

技术标签:

【中文标题】java.io.IOException:android 连接上的流意外结束【英文标题】:java.io.IOException: unexpected end of stream on Connection in android 【发布时间】:2018-01-31 23:42:35 【问题描述】:

我有网络服务 URL,它工作正常。它提供 JSON 数据。

当我使用HttpURLConnectionInputStream 时,我收到此错误:

java.io.IOException: unexpected end of stream on
Connectioncomenius-api.sabacloud.com:443, proxy=DIRECT
hostAddress=12.130.57.1
cipherSuite=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 protocol=http/1.1
(recycle count=0)

我的代码:

try 
    URL url = new URL("https://comenius-api.sabacloud.com/v1/people/username=" + username + ":(internalWorkHistory)?type=internal&SabaCertificate=" + certificate);

    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    InputStream ist = con.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(ist));

    while ((singleLine = reader.readLine()) != null) 
        data = data + singleLine;
        Log.e("Response", data);
    

 catch (Exception e) 
    e.printStackTrace();

如何解决这个问题?

【问题讨论】:

你不能。这是服务器错误。 有其他解决方案吗? 尝试使用OkHttp。它有时对我有用,但我不保证。 @phaneendratatapudi 如何解决这个错误? 如果 localhost 发生这种情况,我正在使用 xampp 并得到相同的错误,但是当我使用 Postman 时它工作得很好.. android 连接问题? 【参考方案1】:

我在使用 OKHttp3 时遇到了同样的问题。问题是我没有关闭每个请求的连接,对于客户端,相同的连接可用,而对于服务器则没有,因此服务器返回错误。

解决方案是指示每个请求在完成时关闭连接。您必须在标题中添加一个标志来表明这一点。在OKHttp3是这样的:

Request request = new Request.Builder()
                             .url(URL)
                             .header("Connection", "close")
                             ...

【讨论】:

这就是答案。它对我来说完美无缺!!我一直在寻找几个小时。 我有一个将 Request 对象作为参数传递的方法。必须改用下面的代码sn-p >> request.addHeader("Connection", "close"); 这是完美的答案! 添加 Connection: Close 标头给了我另一个错误 (javax.net.ssl.SSLException: Write error: ssl=0x7b730be688: I/O error during system call, Broken pipe) 即使在添加后,服务器也会随机抛出 OP 所述的错误。【参考方案2】:

我今天遇到了这个问题。事实证明这是服务器故障,因为服务器在解析请求时抛出错误并关闭。

检查您的后端,如果不是您的,请通知该服务器的所有者

【讨论】:

服务器“抛出”【参考方案3】:

“Keepalive 使客户端很难确定一个响应在哪里结束,下一个响应从哪里开始”1

问题似乎是由于在 2 种情况下重用活动连接时发生冲突引起的:

    服务器未在响应标头中发送 Content-Length

    (流式内容情况,因此不能使用 Content-Length)服务器不使用分块传输编码

因此,如果您观察到异常,请嗅探 http 标头(例如在 Android Studio Profiler 工具中)。如果您将在响应标题中看到两者

“连接:保持活动”

没有

“Content-Length: ***”或“Transfer-Encoding: chunked”标头,

那么这就是上面描述的情况。

由于完全是服务器问题,解决方案应该是计算 Content-Length 并将其放在服务器端的响应头中,如果可能的话(或使用分块传输编码)。

在客户端关闭连接的建议应被视为一种解决方法,请记住它会降低整体性能。

【讨论】:

这听起来很有希望,但我检查了我的标题,我有Connection: keep-aliveTransfer-Encoding: chunked。我仍然有这个问题。 无法观察socket连接,目前android studio网络分析只支持okhttp和httpurlconnection【参考方案4】:

刚刚找到解决办法 这确实是服务器端问题,解决方案是发送内容长度标头如果您使用的是 php,只需将您的代码设为这样

<?php
ob_start();
// the code - functions .. etc ... example:
$v = print_r($_POST,1);
$v .= "\n\r".print_r($_SERVER,1);
$file = 'file.txt';
file_put_contents($file,$v);
print $v;


// finally
$c = ob_get_contents();
$length = strlen($c);
header('Content-Length: '.$length);
header("Content-Type: text/plain");
//ob_end_flush(); // DID NOT WORK !!
ob_flush()
?>

这里使用的技巧是使用输出缓冲区发送内容长度标头

【讨论】:

这是服务器端的问题,但这里没有证据表明服务器使用PHP。 我明白你的意思,如有误解,我会编辑我的答案【参考方案5】:

我遇到了同样的问题,结果我仍然在模拟器上配置了代理,而不再打开 Charles

【讨论】:

【参考方案6】:

我正在使用 XAMPP 使用 localhost 测试我的应用程序并且发生了这个错误,问题出在我使用 443 端口使用 Skype 的端口上,我只是退出了 Skype 并解决了错误!

【讨论】:

【参考方案7】:

这可能是一个旧线程,至于我,检查您的互联网连接(Wifi)可能对访问您的某些端点有一些限制。

我已经通过使用/连接到我的移动数据来修复我的问题。

-欢呼/快乐的编码

【讨论】:

【参考方案8】:

这是一个服务器错误。这意味着以某种方式执行返回到您的客户端,而服务器没有发送实际的响应标头。

如果您可以控制服务器代码,请检查在处理请求后,您是否明确发送了带有响应代码的响应标头。这样改造就知道请求已被处理。

【讨论】:

【参考方案9】:

我也有同样的问题。这个错误是服务器端只支持http2造成的。您需要将 JDK 更新到支持 http2 (>=jdk9) 的版本才能解决此问题。

【讨论】:

【参考方案10】:

考虑使用 OkHttp 的 retryOnConnectionFailure 配置参数 - as documented,这使客户端能够静默恢复:

过时的池连接。ConnectionPool 重用套接字以减少请求延迟,但这些连接偶尔会超时。

如果您使用的是 ktor 客户端(阅读:kotlin 多平台),另请参阅:https://youtrack.jetbrains.com/issue/KTOR-449#focus=Comments-27-4271320.0-0

【讨论】:

【参考方案11】:

很可能有两件事同时发生。 首先,该 url 包含一个不常用的端口,其次,您使用的 *** 或代理不支持该端口。 就个人而言,我遇到了同样的问题。我的服务器端口是 45860,我使用的是 pSiphon 反过滤 ***。 在这种情况下,我的邮递员仅在服务器的 relpy 是状态码大于 0 的错误时才报告“连接挂断”。(当某些文本从服务器返回而没有错误代码时很好) 然后,我将服务器上的 Web 服务端口更改为 8080,哇,它成功了!虽然连接了psiphon ***。因此,我的建议是,如果你能改变服务器端口,那就试试吧,或者检查是否有代理问题

【讨论】:

以上是关于java.io.IOException:android 连接上的流意外结束的主要内容,如果未能解决你的问题,请参考以下文章

java.io.IOException: toDerInputStream 拒绝标签类型 77

java.io.IOException:系统找不到指定的路径

java.io.IOException: Connection reset by peer和java.io.IOException: Connection timed out。Socket

android java.io.IOException:传输端点未连接

任务 ':app:compileDebugKotlin' java.io.IOException 执行失败

火花:java.io.IOException:设备上没有剩余空间[再次!]