java.io.IOException:在android中的Connection上意外结束流

时间:2017-08-23 11:43:09

标签: android rest inputstream httpurlconnection

我有网络服务网址,工作正常。它提供了JSON数据。当我使用HttpURLConnectionInputStream时,我收到了错误消息。喜欢

  

java.io.IOException:意外的流结束   连接{comenius-api.sabacloud.com:443,proxy = DIRECT   hostAddress = 12.130.57.1   cipherSuite = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 protocol = http / 1.1}   (回收计数= 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();
    }

如何解决这个问题?

11 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

刚刚找到解决方案
它实际上是一个服务器端问题和解决方案是发送内容长度标题
如果你使用PHP只是让你的代码像这样

hive -e "$(cat file1.hql file2.hql)"

这里使用的技巧是使用输出缓冲区

发送内容长度标头

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

欢呼/快乐的编码

答案 6 :(得分:0)

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

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

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

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

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

  • “连接:保持活动状态”

没有

  • “内容长度:***”或“传输编码:分块”标头,

然后是上述情况。

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

建议在客户端关闭连接只是一种变通方法,请记住这会降低整体性能。

答案 7 :(得分:0)

它是服务器错误。这意味着执行将以某种方式返回到您的客户端,而无需服务器发送实际的响应头。

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

答案 8 :(得分:0)

我有同样的问题。此错误是由服务器端仅支持http2引起的。您需要将JDK更新到支持http2(> = jdk9)的版本才能解决此问题。

答案 9 :(得分:0)

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

<块引用>

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

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

答案 10 :(得分:-1)

最有可能在同一时间发生两件事。
首先,URL包含一个不常用的端口,其次,您正在使用不支持该端口的VPN或代理。
我个人也遇到同样的问题。我的服务器端口为45860,当时我使用的是pSiphon反过滤器VPN。
在这种情况下,只有当服务器的relpy是状态代码大于0的错误时,我的邮递员才报告“连接挂断”。(当从服务器返回一些文本且没有错误代码时,这是很好的选择)
然后我将服务器上的Web服务端口更改为8080,WOW起作用了!尽管已连接psiphon vpn。
因此,我的建议是,如果可以更改服务器端口,请尝试使用它,或者检查是否存在代理问题