java.net.ProtocolException:意外的流结束

时间:2015-08-24 13:48:47

标签: android android-volley okhttp

我面临一个奇怪的问题,我无法调试它。我已经实现了一个用于上传数据流的逻辑,并且使用了Volley,我在HurlStackaddBodyIfExists api中定制了一个逻辑,因此类型为“application / octet-stream”的主体“可以处理。

我的逻辑是将进度发布给用户,以便可以更新UI,指示用户上传的进度,低于我的逻辑。

            int toRead = length; // File length
            byte[] data = new byte[4096];
            connection.setDoOutput(true);
            if(length != -1) {
                connection.setFixedLengthStreamingMode(length);
            } else {
                connection.setChunkedStreamingMode(4096);
            }

            OutputStream os;
            int i;
            int count;

            os = connection.getOutputStream();
            int progress= 0;

               try {
                    for(i = 0; (count= is.read(data)) > 0; ++i) { // is, is not null and contains a valid input stream
                        os.write(data, 0, count); // at this line am getting unexpected end of stream
                        progress+= count;
                        if(i % 20 == 0) {
                            rs.deliverProgress(progress, 0L);
                            progress= 0;
                        }
                    }

                    os.flush();
                } finally {
                    if(is != null) {
                        is.close();
                    }

                    if(os != null) {
                        os.close();
                    }

                }

执行上面的代码得到这个,虽然我已经验证,输出流不是null,输入流也没有,它在读取循环本身的第一次迭代中失败,我看到它已读取4096字节,然后尝试写入相同。

java.net.ProtocolException: unexpected end of stream
            at com.android.okhttp.internal.http.HttpConnection$FixedLengthSink.close(HttpConnection.java:326)
            at com.android.okio.RealBufferedSink.close(RealBufferedSink.java:174)
            at com.android.okio.RealBufferedSink$1.close(RealBufferedSink.java:142)

任何有关上述调试的帮助都将受到高度赞赏。

4 个答案:

答案 0 :(得分:5)

This可以帮助您:

当预期的字节数(通常在响应的内容长度标头中设置)大于响应中的实际数据时,FixedLengthInputStream抛出该异常。检查内容长度标头是否正确。 (如果您要为内容长度提供自己的值,请确保它是正确的。)

查看设置输入流的代码会有所帮助。

答案 1 :(得分:0)

已修复此问题,请在标头中添加“ Accept-Encoding”,“ identity”,然后服务器端将获得不修改响应的命令,然后将其发送回客户端。

答案 2 :(得分:0)

如果您检查了代码中的所有位置并尝试了stackoverflow和github中的每个解决方案,但问题仍然存在,并且仅在模拟器上测试了代码,则应尝试在实际设备上运行代码。也许它会起作用,或者也许不会,但是如果您感到绝望,请认真尝试。当我偶然发现自己的代码每次都在模拟器上运行但都成功在手机上运行时,我感到非常惊讶。此外,该代码还成功地在其他人的Android模拟器上运行。所以我想我的android studio配置有问题,我找不到。我不知道为什么会这样,就像我们不知道为什么“清理项目/无效缓存”有时比任何解决方案都更好一样。

答案 3 :(得分:0)

您的数据长度可能未知,这有点奇怪。 它是媒体文件吗?还是直播?

无论如何,我尝试上传实时流数据。它发生在相同的错误中。 我将此设置添加到Connection中并解决了我的问题。 传输编码:分块

(“ setChunkedStreamingMode”不起作用。我仍然不知道为什么。)