如何处理“来自服务器的文件意外结束”?

时间:2013-06-24 11:49:06

标签: java sockets exception jsoup

我想使用Jsoup来抓取来自的内容 http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=550633c179112c8002bc6a0942d55b2a&artist=lucinda%20williams&track=lake%20charles

代码是:

    Document doc = Jsoup.connect("http://ws.audioscrobbler.com    /2.0/?method=track.getInfo&api_key=550633c179112c8002bc6a0942d55b2a&artist=lucinda williams&track=lake charles")
                        .userAgent("Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0")
                        .timeout(5000)
                        .get();

然而,出现了一些错误:

    Exception in thread "main" java.net.SocketException: Unexpected end of file from server
            at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770)
            at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
            at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:767)
            at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1162)
            at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:397)
            at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:429)
            at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:410)
            at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:164)
            at org.jsoup.helper.HttpConnection.get(HttpConnection.java:153)
            at JsoupXML.main(JsoupXML.java:16)

但是,当我使用brwoser访问网址时,eveything就可以了。此外,当我使用上面的代码来抓取http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=550633c179112c8002bc6a0942d55b2a&artist=cher&track=believe的内容时,一切都还可以。

您能否知道解决问题的原因和好主意?

感谢您的关注并对我的英语表示抱歉。

感谢NeplatnyUdaj的慷慨帮助,你给我一些精彩的暗示。 我忘了用%20,%26等替换whitspace和其他特殊符号。

2 个答案:

答案 0 :(得分:3)

好。该异常意味着远程服务器意外关闭了连接。

以下答案假定问题代码网址中显示的所有空格实际上都不在您的代码中。

除了捕获异常并重试(或向用户报告错误)之外,您无能为力。

至于为什么服务器关闭连接:

  • 它不喜欢你的要求(重试它不会有帮助), 查看audioscrobbler的文档
    • 是那里的主机标题并且正确(在您的示例中,它是不正确的,因为那里有空格)?
    • 您是否必须包含其他标头才能发出有效请求?
    • 该API密钥是否正确?
  • 服务器当前可能存在问题(导致它丢弃请求,这是重试可能有帮助的地方)
  • 它认为你提出了太多问题,并且已经采取了一些反垃圾邮件保护措施(这是重审会受到伤害的地方)。

在相关说明中:在问题中包含API密钥可能不是最佳的。

答案 1 :(得分:1)

更改用户代理(或至少定义它)。

更多细节: Scraping a site