我正在嘗試編寫基於java-servlet的小型webproxy。該代理具有 只有一個任務:Java-Servlet:對Quicktime視頻進行流式處理會導致ClientAbortException
- HTML應傳遞給發送請求的客戶端(GET與目的端口80的請求通過防火牆規則被重新路由到代理)。
- 嵌入式QuickTime視頻應該被另一個QuickTime視頻替換,並且應該傳遞給客戶端而不是最初請求的(這裏也是,客戶端的最初發送的GET請求首先被重新路由到代理,代理檢測到請求的內容類型不是HTML,並從這個問題得出結論:在這種特殊情況下內容必須是快速時間視頻(見下面的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>
的代理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文檔由代理交付並由瀏覽器正確呈現。但GET請求的quicktime-video和代理的響應分別導致ClientAbortException:java.net.SocketException:斷開管道在servlet-sourcecode的第34行。我試過各種OutputStreams(BufferedOutputStream,DataOutputStream,PipedOutputStream,ServletOutputStream)。他們都沒有工作...
有沒有人看到我的錯誤?
此致, Ashiaka
由於某種原因,客戶端可能會停止下載內容。 /var/www/final_lion.mov有多大?你能用小電影試試嗎? –
final_lion.mov大小爲1 MB。我也嘗試了一個較小的視頻。這個問題也是一樣的。 – ashiaka