我用Java编写了一些代码来解码SHOUTcast流并返回元数据。此代码按预期工作,但当我将其移植到Android时,相同的代码不起作用。具体来说,我似乎无法解析SHOUTcast服务器的HTTP响应头。我可以在Android之外解析它,当我通过Android发出请求时,我似乎只得到垃圾回收。
相关代码如下。
URL u = new URL("http://scfire-mtc-aa01.stream.aol.com:80/stream/1074");
URLConnection uc = u.openConnection();
uc.addRequestProperty("Icy-MetaData", "1");
InputStream in = uc.getInputStream();
byte[] byteheader = new byte[512];
int c = 0;
int i = 0;
int metaint = 0;
while ((c = in.read()) != -1){
byteheader[i] = (byte)c;
if (i > 4){
if (byteheader[i - 3] == '\r' &&
byteheader[i - 2] == '\n' &&
byteheader[i - 1] == '\r' &&
byteheader[i] == '\n')
break;
}
i++;
}
在Android中运行时,此代码会溢出“byteheader”缓冲区。在Android外部运行时,它可以正常运行。为了让事情变得更加奇怪,我通过Wireshark嗅到了对话,并将Android发送的标题回显给了一个文件。当使用netcat发出具有相同标头的请求时,我得到了相应的响应。当我查看Android的logcat输出时,“byteheader”只包含垃圾。
我唯一的想法是,这是我忽略的环境。或者,我遗漏了一些非常明显的东西。
有什么想法吗?
作为编辑,我通过创建一个虚拟应用程序并仅将违规代码放入其中来进一步隔离问题。问题仍然存在,Android返回垃圾,我的相同外部代码按预期工作。我认为这可能与字符编码有某种关系,但似乎两种环境都默认为UTF8。
答案 0 :(得分:4)
我终于将问题跟踪到了URLConnection。显然,该类在我的本地JVM上的运行方式与在Android上的运行方式不同。在Android之外,URLConnection使响应头保持不变。在Android中,消耗响应头,输入流从数据的第一个字节开始。标题信息可通过getHeaderField获得。
我不确定我是否理解这种行为差异,我只能将其归结为Java版本的不同之处。
答案 1 :(得分:0)
使用套接字连接,它应该工作。 Shoutcast不提供通用的HTTP连接。