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

ekqde3dh  于 2022-12-31  发布在  Android
关注(0)|答案(5)|浏览(426)

我遇到了一个奇怪的问题,我无法调试它。我已经实现了一个逻辑上传数据流,并使用Volley相同,我已经定制了一个逻辑位在HurlStackaddBodyIfExists API,所以可以处理类型“应用程序/八位字节流”的主体。
我的逻辑是向用户发布进度,以便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();
                    }

                }

在执行上面的代码时,我得到了这个,尽管我已经验证了,输出流不是空的,输入流也不是,它在读取循环本身的第一次迭代中失败,我看到它已经读取了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)

以上调试过程中的任何帮助都将不胜感激。

6bc51xsx

6bc51xsx1#

This可以帮助您:
当预期的字节数(通常在响应的content-length标头中设置)大于响应中的实际数据时,FixedLengthInputStream会抛出该异常。
检查content-length头文件是否正确(如果您提供自己的内容长度值,请确保它正确)。
查看设置输入流的代码会有所帮助。

6za6bjd0

6za6bjd02#

已经修复了,请在头中添加“Accept-Encoding”,“identity”,然后服务器端会得到命令,它不会修改响应,然后发送回客户端。

fnx2tebb

fnx2tebb3#

如果你已经检查了代码中的每一个地方,尝试了stackoverflow和github中的每一个解决方案,但是问题仍然出现,并且你只在模拟器上测试了你的代码,那么,你应该尝试在你的真实的设备上运行你的代码,也许它会工作,也许它不会,但是如果你感到绝望,就试试吧。说真的。2当我偶然发现我的代码每次在模拟器上运行时都有错误,但在我的移动的上却成功了。3此外,这个代码在其他人的android模拟器上也运行的很成功。所以我猜我的android studio配置有问题,我找不出来。我不知道为什么会发生这种情况,就像我们不知道为什么“清理项目/使缓存无效”有时比任何解决方案都好。

euoag5mw

euoag5mw4#

有点奇怪的是你的数据长度可能是未知的。它是一个媒体文件?还是一个直播流?
无论如何,我试着上传我的实时流媒体数据。它发生在相同的错误。我添加了这个设置到连接,并解决了我的问题。传输编码:成块的
(“setChunkedStreamingMode”不起作用,我仍然不知道为什么。)

baubqpgj

baubqpgj5#

这发生在我的Android模拟器上,而不是发生在我的物理Android设备上。我正在做GET请求flask服务器运行在0.0.0.0在我的笔记本电脑上从Android应用程序。
要在模拟器上修复此问题,请在模拟器代理中添加服务器的IP地址。请参阅如何设置Android模拟器代理设置
我遇到的确切问题是unexpected end of stream retrofit

相关问题