2

私は同様の質問をすべて調べましたが、どの答えも私にとって問題を解決していないようです。TomcatサーバーからAndroidWebブラウザーにビデオファイルをストリーミングしようとしています。Chromeブラウザで動画をストリーミングできます。同様のコードを使用して画像(小さいファイル)を転送することもできます。

これは、ビデオをバイトストリームに変換して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 Webブラウザーでこのビデオファイルにアクセスしようとすると、次のエラーが発生します。

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 に答える