目標:構建一個servlet,以便當我在瀏覽器中輸入http://xxx.com/servpage?a.mp3時,我可以即時開始播放此mp3文件。以前如果我把文件放在goDaddy上作爲一個靜態文件,我可以做到這一點。我的軟件可以馬上播放。如何使用java實現mp3流Servlet
使用Servlet,我可以忽略後面的內容,只是希望此頁面動態返回MP3(因爲將來我可能會返回任何其他文件)。我得到的是一個漫長的等待(> 20秒),然後讓玩家玩。
我跟着一些例子,並注意到在示例中的「附件」。但是,如果我將其刪除,則mp3將無法播放。儘管我正在使用Google App Engine,但只是使用輸入/輸出流來返回http請求。任何人都可以幫忙
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException ,IOException {
res.setContentType("audio/mpeg3");
OutputStream os = res.getOutputStream();
res.setHeader("Content-Disposition", "attachment; filename="" + "a.mp3";");
res.setContentLength(1000000);
FileService fileService = FileServiceFactory.getFileService();
boolean lockForRead = false;
String filename = "/gs/" + BUCKETNAME + "/" + FILENAME;
AppEngineFile readableFile = new AppEngineFile(filename);
try{
FileReadChannel readChannel = fileService.openReadChannel(readableFile, lockForRead);
InputStream is = Channels.newInputStream(readChannel);
int BUFF_SIZE = 1024;
byte[] buffer = new byte[BUFF_SIZE];
try {
do {
int byteCount = is.read(buffer);
if (byteCount == -1)
break;
os.write(buffer, 0, byteCount);
os.flush();
} while (true);
} catch (Exception excp) {
} finally {
os.close();
is.close();
}
readChannel.close();
} catch(Exception e){
}
}
謝謝彼得。我試圖讓一個java webstart應用程序偷偷訪問我的文件,以免服務器以任何方式被濫用。爲此,我將記錄用戶的IP地址並啓動會話。我不認爲只是重定向到谷歌雲存儲可以做到這一點。另外,我不希望用戶對Java彈出窗口感到困擾,說JavaWS試圖訪問不是來自原始Web服務器的文件。我意識到GAE在doGet返回之前不會發送任何內容,只允許1分鐘或處理。所以我可能需要將文件分解爲範圍或使用blob。 – 2012-02-29 01:05:53
好的建議,彼得,只是試了一下。看起來像blob可以提供文件,就好像服務器在文件完全加載之前推送一樣。我可以告訴你很可能它看起來像是Web服務器使用另一個線程來推送數據,所以我的客戶端可以在下載的同時立即播放音樂。所以你基本上節省了我的一天。不勝感激! – 2012-02-29 02:18:11