Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaServlet:Quicktime视频流导致ClientBortException_Java_Servlets_Stream_Quicktime - Fatal编程技术网

JavaServlet:Quicktime视频流导致ClientBortException

JavaServlet:Quicktime视频流导致ClientBortException,java,servlets,stream,quicktime,Java,Servlets,Stream,Quicktime,我正在尝试基于Javaservlet编写一个小型webproxy。此代理具有 只有一项任务: HTML应传递给发送请求的客户端(目标端口为80的GET请求通过防火墙规则重新路由到代理) 嵌入式quicktime视频应替换为另一个quicktime视频,并应传递给客户,而不是最初要求的(这里,客户端最初发送的GET请求也会首先重新路由到代理。代理检测到请求的内容类型不是HTML,并由此得出结论,在这种特殊情况下,内容必须是quicktime视频(请参见下面的HTML))。因此,代理应向客户端发送/

我正在尝试基于Javaservlet编写一个小型webproxy。此代理具有 只有一项任务:

  • HTML应传递给发送请求的客户端(目标端口为80的GET请求通过防火墙规则重新路由到代理)
  • 嵌入式quicktime视频应替换为另一个quicktime视频,并应传递给客户,而不是最初要求的(这里,客户端最初发送的GET请求也会首先重新路由到代理。代理检测到请求的内容类型不是HTML,并由此得出结论,在这种特殊情况下,内容必须是quicktime视频(请参见下面的HTML))。因此,代理应向客户端发送/流式传输特定视频
  • 对于客户端将要请求的以下HTML文档,应该发生这种情况:

    <html>
    <head>
    
    <h1> Heading!</h1>
    </head>
    <body>
    
    <h1>My First Heading</h1>
    
    <object width="160" height="144"
    classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
    codebase="http://www.apple.com/qtactivex/qtplugin.cab">
    <param name="src" value="final_lion.mov">
    <param name="autoplay" value="true">
    <param name="controller" value="false">
    
    <embed src="final_lion.mov" width="480" height="432"
    autoplay="true" controller="false"
    pluginspage="http://www.apple.com/quicktime/download/">
    </embed>
    
    </object> 
    
    </body>
    </html> 
    
    HTML文档由代理交付并由浏览器正确呈现。但quicktime视频的GET请求和代理的响应分别导致servlet源代码第34行出现ClientAbortException:java.net.SocketException:Breaked pipe

    我尝试了各种输出流(BufferedOutputStream、DataOutputStream、PipedOutputStream、ServletOutputStream)

    有人看到我的错误了吗

    你忠实的,
    Ashiaka

    很多流媒体播放器都希望服务器端支持
    范围
    请求。通常是servletcontainer(Tomcat、JBoss AS、Glassfish等)我们自己的默认servlet已经支持这一点。因此,如果有一种方法可以将电影文件夹发布到web上,只需将文件夹添加到服务器配置中,这样您就不需要一个自行开发的servlet,那么我将继续这一路线

    例如,在Tomcat中,只需将文件移动到
    Tomcat/webapps/movies
    文件夹中,或者在其
    /conf/server.xml
    中添加以下行即可实现此目的:

    
    
    如果您根据配置选择将
    final_lion.mov
    文件放入
    Tomcat/webapps/movies
    /var/www/movies
    文件夹中,那么您应该能够通过访问它,而不需要任何自制的servlet。相反,Tomcat自己的将用于流式传输静态内容


    但是如果没有办法,那么您需要重写servlet代码,使其能够支持
    范围
    请求(也称为下载简历)。您可以在中找到一个具体的启动示例。

    我也面临同样的问题,并花了几天的时间尝试逐一挖掘。 这与您的浏览器缓存问题有关。您可以尝试使用此代码。它适用于我


    response.addHeader(“缓存控制”,“无转换,最大年龄=0”);

    客户端可能会因为某种原因停止下载内容。/var/www/final_lion.mov有多大?你能用一部小电影试试吗?final_lion.mov的大小是1MB。我也用了一个较小的视频。同样的问题。
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        ServletContext context = getServletContext();
        PrintWriter out = null;
        try {
                String result = new String();
                String urlStr = request.getRequestURL().toString();
    
    
                URL url = new URL(urlStr);
                URLConnection conn = url.openConnection();
    
                response.setContentType(conn.getContentType());
    
                if (conn.getContentType().contains("text/"))
                {
                    out = response.getWriter(); 
                    out.write(getTextContent(conn));
                    out.flush();
                    out.close();
                }
                else
                {
                    File file = new File("/var/www/final_lion.mov");
                    response.setContentType("video/quicktime");
                    response.setHeader("Content-Length", Long.toString(file.length()));
                    response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
                    FileInputStream input = new FileInputStream(file);
                    OutputStream output = response.getOutputStream();
    
                    byte[] buffer = new byte[4096];
                    int read = 0;
                    while((read = input.read(buffer)) != -1 ){
                        output.write(buffer,0,read);
                    }
                    input.close();
                    output.flush();
                    output.close();
    
                }
            } catch (Exception e) {
                    context.log("error", e);
            }
    }
    
    private String getTextContent(URLConnection conn)
    {
        try{
            BufferedReader rd = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line + "\n");
            }
            rd.close();
            return sb.toString();
        }catch (Exception e){
            return "error: " + e.toString();
        }
    }