1

私のアプリケーションでは、Web コンテンツを圧縮しています。Web コンテンツには動画が埋め込まれています。

Android の Web ビューでコンテンツを表示します。NanoHTTPD サーバーを介してコンテンツを提供しています。私はAndroid 4.2.2とNanoHTTPDの最新バージョンを使用しています

私のサーバーは、範囲リクエストによる部分的なコンテンツ処理をサポートしています。このエラーは、最初の呼び出し自体、つまりサーバーから accept-range 応答が送信されたときに発生します。

サーバーからの応答として、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 に答える