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

pha*_*udi 10 rest android inputstream httpurlconnection

我有网络服务URL,它工作正常.它提供了JSON数据.当我使用HttpURLConnectionInputStream,我收到一个错误.喜欢

java.io.IOException:Connection上的意外流结束{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}(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();
    }
Run Code Online (Sandbox Code Playgroud)

怎么解决这个问题?

Rad*_*ost 17

我有同样的问题使用OKHttp3.问题是我没有关闭每个请求的连接,并且客户端可以使用相同的连接而服务器没有,因此服务器返回错误.

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

Request request = new Request.Builder()
                             .url(URL)
                             .header("Connection", "close")
                             ...
Run Code Online (Sandbox Code Playgroud)

  • 这就是答案。它对我来说非常有效!我已经找了几个小时了。 (4认同)

TiM*_*FeJ 9

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

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

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

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

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

  • “连接:保持活动”

和不

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

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

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

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

  • 这听起来确实很有希望,但我检查了标题,发现有“Connection: keep-alive”和“Transfer-Encoding: chunked”。我仍然有这个问题。 (3认同)

小智 7

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

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

  • 服务器“抛出” (3认同)