4

我用 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 中运行时,此代码会溢出“b​​yteheader”缓冲区。在 Android 外部运行时,它可以正常运行。为了让事情变得更奇怪,我通过 Wireshark 嗅探了对话并将 Android 发送的标头回显到一个文件中。当使用 netcat 发出具有相同标头的请求时,我得到了适当的响应。当我查看 Android 的 logcat 输出时,“byteheader”只包含垃圾。

我唯一的想法是,这是我忽略的环境问题。或者,我遗漏了一些非常明显的东西。

有任何想法吗?

作为编辑,我通过创建一个虚拟应用程序并仅将有问题的代码放入其中来进一步隔离问题。问题仍然存在,Android 返回垃圾,我的相同外部代码按预期工作。我认为这可能与字符编码有关,但似乎两种环境都默认为 UTF8。

4

2 回答 2

4

我终于将问题追溯到 URLConnection。显然,该类在我的本地 JVM 上的运行方式与在 Android 上的运行方式不同。在 Android 之外, URLConnection 保持响应标头完好无损。在 Android 中,响应标头被使用,输入流从数据的第一个字节开始。标题信息可通过 getHeaderField 获得。

我不确定我是否理解这种行为差异,我只能将其归结为 Java 版本的差异。

于 2010-11-25T17:29:15.773 回答
0

使用套接字连接,它应该可以工作。Shoutcast 不提供通用的 HTTP 连接。

于 2010-12-07T07:58:11.383 回答