2

我已经查看了所有类似的问题,但似乎没有一个答案能解决我的问题。我正在尝试将视频文件从我的 Tomcat 服务器流式传输到 android Web 浏览器。我可以在 Chrome 浏览器中流式传输视频。我还可以使用类似的代码传输图像(较小的文件)。

这是我的 servlet 代码,它将视频转换为字节流以通过 HTTP 传输

public class VideoServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    try {
        File file = new File("C:\\Users\\ishan\\Desktop\\hisocData\\"
                + req.getPathInfo().substring(1));

        FileInputStream is = new FileInputStream(file);

        resp.setHeader("Content-Length", Long.toString(file.length()));
        resp.setContentType("video/3gpp");

        // Open the file and output streams
        OutputStream out = resp.getOutputStream();

        // Copy the contents of the file to the output stream
        byte[] buf = new byte[1024];
        int count = 0, length = 0;
        while ((count = is.read(buf)) >= 0) {
            out.write(buf, 0, count);
            length += count;
        }
        is.close();
        out.close();
        resp.setContentLength(length);
    } catch (FileNotFoundException e) {
        OutputStream out = resp.getOutputStream();
        out.write("File not found!".getBytes());
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

当我尝试在 Android 网络浏览器上访问此视频文件时出现此错误:

ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:413)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:401)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)
    at data.VideoServlet.doGet(VideoServlet.java:40)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
    at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240)
    at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:84)
    at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
    at org.apache.coyote.Response.doWrite(Response.java:504)
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:383)

我将衷心感谢您的帮助。我已经被这个问题困扰了几天了。

4

4 回答 4

1

您需要实现 HTTP 范围支持。看到这个,几乎相同的问题/答案。

于 2012-11-11T13:41:07.920 回答
0

该问题很可能是由于在响应已发送后尝试设置内容长度引起的。您应该删除此行

resp.setContentLength(length);

请注意,它等同于您在请求开始时所做的:

resp.setHeader("Content-Length", Long.toString(file.length()));

我建议您将 resp.setHeader(...) 替换为 resp.setContentLength(file.length());

于 2012-11-11T16:05:46.763 回答
0

问题是我试图以播放器无法识别的 .3gp 格式传输视频。当我将其更改为 .mov 时,它运行良好。麻烦各位了,抱歉

于 2013-02-07T07:17:40.083 回答