私のアプリケーションでは、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 などの小さなファイルの場合は機能します。
乾杯、サウラフ