1

在我的应用程序中,我压缩了网页内容。Web 内容中嵌入了视频。

我通过 Android 网页视图显示 wen 内容。我通过 NanoHTTPD 服务器提供我的内容。我在 Android 4.2.2 和 NanoHTTPD 的最新版本上

我的服务器通过范围请求支持部分内容处理。此错误出现在初始调用本身中,即当从我的服务器发送接受范围响应时。

作为 ZipInputInflaterStream 的视频是作为响应从我的服务器发送的。

每当我尝试观看大尺寸的视频时,我都会得到这个堆栈跟踪。

10-03 14:48:28.097: E/NanoHTTPD(9454): java.net.SocketException: sendto failed: ECONNRESET (Connection reset by peer)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at libcore.io.IoBridge.sendto(IoBridge.java:475)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at test.http.server.NanoHTTPD$Response.sendAsFixedLength(NanoHTTPD.java:806)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at test.http.server.NanoHTTPD$Response.send(NanoHTTPD.java:745)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at test.http.server.NanoHTTPD$HTTPSession.execute(NanoHTTPD.java:1075)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at test.http.server.NanoHTTPD$1$1.run(NanoHTTPD.java:211)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at java.lang.Thread.run(Thread.java:856)
10-03 14:48:28.097: E/NanoHTTPD(9454): Caused by: libcore.io.ErrnoException: sendto failed: ECONNRESET (Connection reset by peer)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at libcore.io.Posix.sendtoBytes(Native Method)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at libcore.io.Posix.sendto(Posix.java:151)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
10-03 14:48:28.097: E/NanoHTTPD(9454):  at libcore.io.IoBridge.sendto(IoBridge.java:473)
10-03 14:48:28.097: E/NanoHTTPD(9454):  ... 8 more

NanoHTTPD 中的客户端套接字似乎断开连接。下面是引发此错误的 NanoHTTPD 代码

private void sendAsFixedLength(OutputStream outputStream, int pending) throws IOException
    {
        if (requestMethod != Method.HEAD && data != null) {
            int BUFFER_SIZE = 16 * 1024;
            byte[] buff = new byte[BUFFER_SIZE];
            while (pending > 0) {
                int read = data.read(buff, 0, ((pending > BUFFER_SIZE) ? BUFFER_SIZE : pending));
                if (read <= 0) {
                    break;
                }
                outputStream.write(buff, 0, read); //error thrown from here
                pending -= read;
            }
        }
    }

outputStream.write 抛出上面的堆栈跟踪。

对于这样的大文件,在异常发生后,Android 媒体播放器会发送范围请求。这在我提取文件并通过 FileInputStream 发送内容时有效。

问题是 NanoHTTPD 能够读取 ZipInputInflaterStream 更长的时间吗?即使它读取了为什么客户端套接字被关闭?

请注意,此问题仅发生在 19 MB 等大型视频中。对于像 11 MB 这样的较小文件,它可以工作。

干杯,索拉夫

4

1 回答 1

0

我有同样的问题,切换到Release-2.0.5标签后,一切正常。

于 2015-08-06T03:13:50.773 回答