0

我可以使用这样的套接字手动连接到 HTTP-Livestream:

Socket radio = new Socket();
radio.connect(new InetSocketAddress("streaming.fueralle.org", 8000));
PrintWriter out = new PrintWriter(radio.getOutputStream());
out.println("GET /corax.mp3 HTTP/1.0");
out.println("User-Agent: Wget/1.8.2");
out.println("Host: streaming.fueralle.org:8000");
out.println("Accept: */*");
out.println("Connection: Keep-Alive");
out.println("");
out.flush();

DataInputStream is = new DataInputStream(radio.getInputStream());
String headerLine = is.readLine();
while(headerLine.length() > 0){
    resp.getWriter().println("next line is " + headerLine);
    headerLine = is.readLine();
}

现在我必须改为使用 URL 和 HttpUrlConnection 进行此连接(我计划从不允许 Socket 的 Google App Engine 运行它)。但我似乎错过了重要的一点。如果我尝试像 heise.de 这样的静态页面,它可以工作。但我无法开始阅读连续的 Stream。

EDIT2:我已经将源代码(和整个项目)放在了 github 中,我错过了一件大事吗?https://github.com/flaschenpost/GoogleAppRadio/blob/master/MGRadio/src/de/gergele/mgradio/MGRadioServlet.java

这里有一个片段。

URL u = new URL("http://streaming.fueralle.org:8000/corax.mp3");
// URL u = new URL("http://www.heise.de");
System.out.println("trying to connect!" + u);
HttpURLConnection conn = (HttpURLConnection)u.openConnection();
conn.addRequestProperty("User-Agent", "MGet/1.0.0");
conn.addRequestProperty("Accept", "*/*");
// conn.addRequestProperty("Connection", "Keep-Alive");
// EDIT: I tried with and without setChunkedStreamingMode, I hoped it would 
//       tell the connection-object about the streaming mode from the server
conn.setChunkedStreamingMode(4096);
System.out.println("setup finished..." + conn + " " + conn.getRequestProperties().toString());
System.out.println(" type: " + conn.getContentType());

DataInputStream is = new DataInputStream(conn.getInputStream());

但这会在从标题中读取单个字符之前导致 TimeoutException。

所以现在我的问题是:如何将 HTTP-Connection 调整为与 Socket-Connection 一样成功?我真的必须编写自己的 URLStreamHandlerFactory 吗?听起来有点奇怪……

wget 和 curl 很容易得到那个流,我已经花了半个晚上才发现 Java URL 似乎对那些直播有很多魔力。

谢谢你的帮助!

4

1 回答 1

0

您不能使用谷歌应用引擎进行直播。GAE 框架对 servlet 执行时间证明有时间限制。如果您执行后台任务(gae 中的后端),您将需要付费。而且您仍然只能保存流,而不能实时流式传输。

于 2013-10-31T20:46:11.223 回答