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