Java HTTPClient在执行GET-on-stream时从不离开socketRead()-变通方法?

Java HTTPClient在执行GET-on-stream时从不离开socketRead()-变通方法?,java,apache-httpclient-4.x,Java,Apache Httpclient 4.x,我使用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); 对cli

我使用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流中做到这一点,但这次不行


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

该站点非常特殊。如果不指定受支持的
用户代理
(如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
200正常
ICE-notice1:
此流需要
icy-notice2:SHOUTcast分布式网络音频服务器/Linux v1.9.8
冰冷的名字:181.FM-披头士频道 冰封流派:老歌 冰冷的url:http://www.181.fm 内容类型:音频/mpeg 冰酒吧:1 冰br:128
这表示响应不是有效的HTTP响应。这是来自ICE协议的ICE响应

现在,您使用的默认
HttpClient
使用了一个
DefaultHttpResponseParser
,它是一个

可跳过格式错误的宽松HTTP响应解析器实现 直到遇到有效的HTTP响应消息头为止

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


我认为使用Http组件库无法实现您想要的功能。要么在Java中寻找一个
ICY
客户端实现,要么自己旋转。

如果它永久性地阻塞,它就不会连续读取。这两者是相互排斥的。你的证据是什么?@EJP-我已经改变了措辞,让它更清楚地表达了什么意思。如果它再也不回来,它就会被封锁“锁定”是你想象的虚构。它只能读取你让它读取的字节数,然后它就会返回。亲爱的@EJP,这正是我刚开始说的,显然这对你来说还不够好。欢迎您自己编辑我的问题,以符合您的期望。另外,如果您不清楚我说的是什么,我希望您自己运行代码-我说“锁定”,因为这就是正在发生的事情-它不会读取“我告诉它的字节数”,它会一直不确定地读取,直到我手动关闭程序。这很可能是HTTPClient的一个问题,在这种情况下,我希望能提供一些解决方法。谢谢。我认为通过实现一个定制的LineParser()可以相对容易地增加对ICY协议的支持。就我的问题而言,这确实解决了这个问题,而且(根据@oleg的评论)最终解决这个问题的正确方法似乎是实现一个支持ICY的LineParser。谢谢你们两位!