目标:构建一个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