在我的应用程序中,我压缩了网页内容。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 这样的较小文件,它可以工作。
干杯,索拉夫