0

我正在使用 Apache HttpClient(来自 Apache HTTP Components 4.3)来针对 ShoutCast 流执行 GET:

CloseableHttpClient client = HttpClients.createDefault();
HttpGet request = new HttpGet("http://relay3.181.fm:8062/");
CloseableHttpResponse response = client.execute(request);

对 client.execute() 的调用永远不会返回,并且根据调试器,它是对 java.net.SocketInputStream#socketRead0() 的嵌套调用,它是调用堆栈中的最后一个节点。通过分析代码,我唯一的结论(基于不断增加的 char[] 分配数量)是它只是“锁定”到流并无限期地从套接字中提取字节。

我想要的是让客户端简单地正常工作并给我一个 HTTPResponse,我可以用它来从流中提取我想要的东西。事实上,我已经能够使用其他 ShoutCast 流来做到这一点,但不是这个。

有没有办法解决这个问题?例如,我可以告诉客户端在一定数量的字节后中断吗?

4

1 回答 1

2

那个网站很特别。如果您未指定支持的User-Agent(如 Mozilla),则服务器会保留流式传输字节。我不知道这些字节是什么意思,也许是音频。

如果您打印出收到的字节,您将看到

ICY 200 OK
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>
icy-name:181.FM - The Beatles Channel
icy-genre:Oldies
icy-url:http://www.181.fm
content-type:audio/mpeg
icy-pub:1
icy-br:128

这表明响应不是有效的 HTTP 响应。这是来自 ICY 协议的 ICY 响应。

现在您使用的默认值HttpClient使用 aDefaultHttpResponseParser这是

宽松的 HTTP 响应解析器实现,可以跳过格式错误的数据,直到遇到有效的 HTTP 响应消息头。

换句话说,它一直读取服务器正在发送的字节,直到它找到一个有效的HTTP响应头,这永远不会发生,因此是无限读取。

我认为您无法使用 Http Components 库完成您想要的工作。要么在 Java 中寻找ICY客户端实现,要么自行开发。

于 2013-11-12T04:49:20.020 回答