gpt4 book ai didi

Java-Servlet : Streaming of a Quicktime-video causes a ClientAbortException

转载 作者:行者123 更新时间:2023-11-30 04:59:48 24 4
gpt4 key购买 nike

我正在尝试编写一个基于 java-servlet 的小型 Web 代理。该代理有只有一项任务:

  1. HTML 应传递到发送请求的客户端(目标端口 80 的 GET 请求将根据防火墙规则重新路由到代理)。
  2. 嵌入的quicktime-video应被另一个quicktime-video替换,并应传递给客户端而不是最初请求的(这里,客户端最初发送的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>

proxy-servlet的源代码如下:

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();
}
}

HTML 文档由代理传递并由浏览器正确呈现。但是,quicktime-video 的 GET 请求以及代理的响应会在 servlet 源代码的第 34 行导致 ClientAbortException: java.net.SocketException: Broken pipeline

我尝试了各种OutputStreams(BufferedOutputStream、DataOutputStream、PipedOutputStream、ServletOutputStream)。他们都没有工作...

有人看到我的错误吗?

您真诚的,芦香

最佳答案

许多流媒体播放器希望服务器端支持Range请求。通常 servlet 容器(Tomcat、JBoss AS、Glassfish 等)自己的默认 servlet 已经支持这一点。因此,如果有一种方法只需将文件夹添加到服务器配置即可将电影文件夹发布到网络中,这样您就不需要自行开发的 servlet,那么我会采用这种方法。

例如,在 Tomcat 中,您只需将文件移动到 Tomcat/webapps/movies 文件夹中,或者将以下行添加到其 /conf/server.xml:

<Context docBase="/var/www/movies" path="/movies" />

如果根据配置将 final_lion.mov 文件放入 Tomcat/webapps/movies/var/www/movies 文件夹中选择,那么您应该可以通过 http://localhost:8080/movies/final_lion.mov 访问它无需任何自行开发的 servlet。相反,Tomcat自己的DefaultServlet将用于流式传输静态内容。

但是如果没有办法,那么您需要重写 servlet 代码,使其支持 Range 请求(也称为下载恢复)。您可以在 this article 中找到具体的启动示例。 .

关于Java-Servlet : Streaming of a Quicktime-video causes a ClientAbortException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com