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 数据。
当我使用HttpURLConnection
和InputStream
时,我收到此错误:
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-alive
和Transfer-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:传输端点未连接